2014-05-14 3 views
0

사용자가 표시 목록보기를 새로 고침 할 때마다 (항상 Gmail 응용 프로그램이나 reddit 동기화 응용 프로그램에서 수행하는 방식과 달리) 작업 표시 줄에 TextView를 오버레이하려고합니다. 나는 상쾌하게하기 위해 SwipeRefreshLayout을 사용하고있다. 그러나 나는 그것이 부적절하다고 생각한다. TextView를 보유하고있는 class (HeaderTransformer)를 가지고 TextManager를 디스플레이에 연결하기 위해 WindowManager를 사용합니다. HeaderTransformer 클래스의 인스턴스는 조각 내에서 호출됩니다 (SwipeRefreshLayout 및 ListView를 유지하여 새로 고침). 단편을 처음 만들 때 TextView 오버레이가 완벽하게 작동합니다. 그러나 화면을 회전 시키거나 조각을 다시 만들면 WindowManager는 TextView를 첨부하지 않고 BadTokenException을 발생시킵니다. 스택 트레이스 WindowManager.addView 오리엔테이션 변경시 BadTokenException

private HeaderTransformer ht; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_misc, container,  false); 
    View refresh_header = getActivity().getLayoutInflater().inflate(R.layout.swipe_refresh_header_layout, null); 
    ht = new HeaderTransformer(getActivity(), refresh_header); 
} 
@Override 
public void onResume() { 
    super.onResume(); 
    getActivity().runOnUiThread(new Runnable(){ 
     @Override 
     public void run() { 
     if(!getActivity().isFinishing()) 
       ht.addHeaderViewToActivity(getActivity()); 
     } 
     }); 
} 

HeaderTransformer.java 여기

public class HeaderTransformer { 
    private View mHeaderView; 
    private TextView mMainTextView; 
    private Context mContext; 
    public HeaderTransformer(Context context, View headerView) { 
     mHeaderView = headerView; 
     mContext = context; 
     mMainTextView = (TextView) headerView.findViewById(R.id.ptr_text); 
    } 

    public void onReset() { 
     mMainTextView.setVisibility(View.VISIBLE); 
     mMainTextView.setText(R.string.pull_to_refresh_label); 
    } 

    public void onRefreshStarted() { 
     mMainTextView.setText(R.string.refreshing_label); 
    } 

    public void addHeaderViewToActivity(Activity mActivity) { 

     Rect mRect = new Rect(); 
     // Get the Display Rect of the Decor View 
      mActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(mRect); 

     // Honour the requested layout params 
     int width = WindowManager.LayoutParams.MATCH_PARENT; 
     int height = WindowManager.LayoutParams.WRAP_CONTENT; 
     ViewGroup.LayoutParams requestedLp = mHeaderView.getLayoutParams(); 
     if (requestedLp != null) { 
      width = requestedLp.width; 
      height = requestedLp.height; 
     } 

     // Create LayoutParams for adding the View as a panel 
     WindowManager.LayoutParams wlp = new WindowManager.LayoutParams(width, height, 
      WindowManager.LayoutParams.TYPE_APPLICATION_PANEL, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | 
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
      PixelFormat.TRANSLUCENT); 
     wlp.x = 0; 
     wlp.y = mRect.top; 
     wlp.gravity = Gravity.TOP | Gravity.LEFT; 
     // Workaround for Issue #182 
     mHeaderView.setTag(wlp); 
     try{ 
      mActivity.getWindowManager().addView(mHeaderView, wlp); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
} 

것 :

05-14 00:09:03.286: W/System.err(18190): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
05-14 00:09:03.286: W/System.err(18190): at android.view.ViewRootImpl.setView(ViewRootImpl.java) 
05-14 00:09:03.286: W/System.err(18190): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java) 
05-14 00:09:03.286: W/System.err(18190): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java) 
05-14 00:09:03.286: W/System.err(18190): at com.faisalalqadi.resume.util.HeaderTransformer.addHeaderViewToActivity(HeaderTransformer.java:72) 
05-14 00:09:03.286: W/System.err(18190):at com.faisalalqadi.resume.fragment.MiscellaneousFragment$3.run(MiscellaneousFragment.java:260) 
05-14 00:09:03.286: W/System.err(18190): at android.app.Activity.runOnUiThread(Activity.java) 
05-14 00:09:03.286: W/System.err(18190): at com.faisalalqadi.resume.fragment.MiscellaneousFragment.onResume(MiscellaneousFragment.java:256) 
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.Fragment.performResume(Fragment.java:1543) 
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:974) 
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115) 
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1097) 
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1905) 
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:466) 
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:455) 
05-14 00:09:03.296: W/System.err(18190): at android.app.Activity.performResume(Activity.java) 
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.performResumeActivity(ActivityThread.java) 
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java) 
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java) 
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java) 
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.access$900(ActivityThread.java) 
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread$H.handleMessage(ActivityThread.java) 
05-14 00:09:03.296: W/System.err(18190): at android.os.Handler.dispatchMessage(Handler.java) 
05-14 00:09:03.296: W/System.err(18190): at android.os.Looper.loop(Looper.java) 
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.main(ActivityThread.java) 
05-14 00:09:03.296: W/System.err(18190): at java.lang.reflect.Method.invokeNative(Native Method) 
05-14 00:09:03.296: W/System.err(18190): at java.lang.reflect.Method.invoke(Method.java) 
05-14 00:09:03.296: W/System.err(18190): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 

나는 모든 찾고 있었어요

조각 코드 : 여기

몇 가지 코드 위에 평범하지 않은 것을 나타낼 수있는 모든 것. 내가 보았던 모든 리소스는 Activity에 대한 getApplicationContext()를 교환했다. 오류의 원인은 HeaderTransformer가 오리엔테이션 변경시 삭제되거나 제거 된 활동/뷰에 대한 참조를 보유하고 있다고 생각합니다. HeaderTransformer 인스턴스의 인스턴스에서 보유하고있는 뷰 또는 활동에 대한 참조를 제거하려고 시도했으며 (mHeaderView를 매개 변수로 (지역 변수 대신) 전달하도록 모든 함수를 변경했습니다.) 여전히 BadTokenException이 발생합니다. 사람이 화면 회전이 저장된 인스턴스를 얻을 클래스를 변환 통과 할 때

+0

http://stackoverflow.com/questions/4187673/problems-creating- a-pop-window-in-android-activity는이 링크를 보았습니다 – duggu

답변

0

그래서 당신의 인스턴스를 저장?이 원인이 될 수 무엇을 알고 있나요.

관련 문제