Android 碎片对话框可以';将标记添加到getSupportFragmentManager后,无法立即通过标记找到它

Android 碎片对话框可以';将标记添加到getSupportFragmentManager后,无法立即通过标记找到它,android,android-fragments,Android,Android Fragments,你们中的任何人在将碎片添加到碎片管理器后是否遇到过未找到的碎片?当我们试图隐藏它时,它会停留在屏幕上 从fragment:onActivityCreated,我们将显示以下对话框: @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Push the progress dialog Str

你们中的任何人在将碎片添加到碎片管理器后是否遇到过未找到的碎片?当我们试图隐藏它时,它会停留在屏幕上

从fragment: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();
}
稍后,从新线程中的同一片段中,我们隐藏了对话框:

@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!");
                }
            }
        }
    }
}
然后隐藏函数:

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!");
                }
            }
        }
    }
}
public void hideHttpWaitingDialog()
{
已同步(mRefCount)
{
Log.w(“showhideHttpWaitingDialog”、“--mRefCount:”+mRefCount);
如果(mRefCount<0)
{
w(“showhideHttpWaitingDialog”,“为什么要隐藏不存在的东西?”);
mRefCount=0;
}
其他的
{
如果(mRefCount==0)
{
FragmentManager fragman=getSupportFragmentManager();
如果(fragman!=null)
{
Fragment frag=fragman.findFragmentByTag(“httpWaitDialog”);
如果(frag!=null)
{
fragman.beginTransaction().remove(frag.commit();
Log.w(“showhideHttpWaitingDialog”,“正常解除”);
}
其他的
Log.w(“showhideHttpWaitingDialog”,“未找到HttpWaitingDialog!”);
}
}
}
}
}

我可以告诉你你的问题是什么。。。除了UI线程外,您不能在任何其他线程中更新UI

我自己也不知道如何修复它,但快速搜索会发现以下问题,这些问题可能很有用


第二个函数似乎更适用于您当前的代码。

我将show and hide函数包装在runOnUiThread()中,它成功了。非常感谢!