Android片段替换(...)在线程上

时间:2016-04-22 10:44:19

标签: java android multithreading android-fragments

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

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

1 个答案:

答案 0 :(得分:2)

您正在使用新实例交换相同的片段 B

  

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

我可以从答案this和问题this

推迟

所以,解决方法是:

  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();
    

    }

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

    希望这会对你有所帮助