2012-05-03 10 views
0

フラグメントマネージャにフラグメントを追加した後で、フラグメントが見つからないことがありますか?私たちがそれを隠そうとすると、画面上に止まったままです。フラグメントからFragmentDialogをgetSupportFragmentManagerに追加した直後にタグで見つけることができません

:onActivityCreated我々はダイアログを表示:

@Override 
public void onActivityCreated(Bundle savedInstanceState) 
{ 
    super.onActivityCreated(savedInstanceState); 

    // Push the progress dialog 
    String text = getActivity().getString(R.string.httpLoadingData); 
    ((BaseFragmentActivity) getActivity()).showHttpWaitingDialog(text); 

    ... 
} 

後、私たちは、ダイアログを隠し、新しいスレッド内の同じフラグメントから:ここで

private void prepareInitialWebViewData() { 
    initialFragmentWebDataLoadingThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      updateDataAndView(); 

      BaseFragmentActivity activity = (BaseFragmentActivity) getActivity(); 

        BaseFragmentActivity activity = (BaseFragmentActivity) getActivity(); 
        if (activity != null) 
        { 
         activity.hideHttpWaitingDialog(); 
        } 

      // We don't need to keep this handle any longer since we've done 
      // the work 
      initialFragmentWebDataLoadingThread = null; 
     } 
    }); 

    initialFragmentWebDataLoadingThread.start(); 
} 

は、私たちのBaseFragmentActivityで見つかったコードです両方とも表示と非表示を切り替えます。 showdialogを何度も呼び出すことができるので、refcountを保持することに注意してください。

まずショー機能:次に

public void showHttpWaitingDialog(CharSequence title) 
{ 
    synchronized (mRefCount) 
    { 
     mRefCount++; 

     Log.w("showhideHttpWaitingDialog", "++mRefCount:" + mRefCount + ", Title:" + title); 

     FragmentManager fm = getSupportFragmentManager(); 
     if (fm != null) 
     { 
      Fragment frag = fm.findFragmentByTag("httpWaitDialog"); 

      if (frag == null) 
      { 
       WaitingOnHttpFragmentDialog dialog = WaitingOnHttpFragmentDialog.newInstance(title); 

       fm.beginTransaction().add(dialog, "httpWaitDialog").commit(); 
      } 
     } 
     else 
      Log.w("showhideHttpWaitingDialog", "fragman == null"); 
    } 
} 

非表示機能:

public void hideHttpWaitingDialog() 
{ 
    synchronized (mRefCount) 
    { 
     Log.w("showhideHttpWaitingDialog", "--mRefCount:" + mRefCount); 

     if (mRefCount < 0) 
     { 
      Log.w("showhideHttpWaitingDialog", "Why are you trying to hide something that doesn't exists?"); 
      mRefCount = 0; 
     } 
     else 
     { 
      if (mRefCount == 0) 
      { 
       FragmentManager fragman = getSupportFragmentManager(); 
       if (fragman != null) 
       { 
        Fragment frag = fragman.findFragmentByTag("httpWaitDialog"); 

        if (frag != null) 
        { 
         fragman.beginTransaction().remove(frag).commit(); 
         Log.w("showhideHttpWaitingDialog", "dismissed normally"); 
        } 
        else 
         Log.w("showhideHttpWaitingDialog", "httpWaitDialog not found!"); 
       } 
      } 
     } 
    } 
} 

答えて

1

私はあなたが他のスレッドでUIを更新することはできません...あなたの問題が何であるかを伝えることができますUIスレッドよりも優先されます。

自分で解決する方法はわかりませんが、すばやく検索すると便利な次の質問が表示されます。

SO Question 1

SO Question 2

それはあなたの現在のコードに、より密接に適用されるようにもう一つはそうです。

+0

私はshowとhideの関数をラップしました\t \t runOnUiThread()と働いていました。本当にありがとう! –

関連する問題