2012-05-03 41 views
0

任何你曾经遇到没有被发现将其添加到片段Manager之后片段后立即发现了什么?当我们试图隐藏它时,它会停留在屏幕上。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

我裹了进去\t \t runOnUiThread()的显示和隐藏功能和它的工作。谢谢一堆! –