繁体   English   中英

线程上的Android片段replace(…)

[英]Android fragment replace(…) on thread

有人可以解释一下为什么替换线程上的片段有时会导致空白,而不是在屏幕上显示片段吗?

public void swapFragment(final CustomFragment fragment) {

    new Thread(new Runnable() {
        @Override
        public void run() {
            FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
            ft.replace(R.id.fragment_container, fragment, fragment.getName());
            ft.addToBackStack(fragment.getName());

            ft.commit();
        }
    }).start();

}

让我解释一下发生了什么:

1)我没有在容器中添加任何片段。

2)我正在使用这种方法添加片段A-它的工作

3)然后我正在使用此方法将实际的片段A与片段B交换-它的工作原理

4)但是,当我尝试与片段A的新实例( !!! )交换时,它留有空白

我知道我可以在主线程上执行此操作,但这只是一个示例。 我正在处理其他问题,但是我的问题解释起来比较复杂。

编辑:

在第4点),我放错了片段-这是“ 片段A

您正在将相同的片段B与其新实例交换。

交换操作仅在源片段和目标片段属于不同类时才有效。

我可以回答这个推迟这个和质疑这个

因此,解决方法是:

  1. 检查是否已经添加了相同的片段类( isAdded() ),如果没有,则使用swap()否则使用remove()add()操作

     public void swapFragment(final CustomFragment fragment) { new Thread(new Runnable() { @Override public void run() { FragmentTransaction ft = activity.getFragmentManager().beginTransaction(); if(!fragment.isAdded()) { ft.replace(R.id.fragment_container, fragment, fragment.getName()); ft.addToBackStack(fragment.getName()); ft.commitAllowingStateLoss(); } else { ft.remove(R.id.fragment_container, fragment); ft.add(fragment); ft.addToBackStack(fragment.getName()); ft.commitAllowingStateLoss(); } }).start(); 

    }

  2. 检查是否已经添加了相同的片段类( isAdded() ),然后更新其UI内容,否则swap()

     public void swapFragment(final CustomFragment fragment) { new Thread(new Runnable() { @Override public void run() { FragmentTransaction ft = activity.getFragmentManager().beginTransaction(); if(!fragment.isAdded()) { ft.replace(R.id.fragment_container, fragment, fragment.getName()); ft.addToBackStack(fragment.getName()); ft.commitAllowingStateLoss(); } else { // logic to update UI of same instance } } }).start(); 

    }

仍然,这个问题的确切解决方案正在等待:)

希望这个能对您有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM