Java 线程上的Android片段替换(…)

Java 线程上的Android片段替换(…),java,android,multithreading,android-fragments,Java,Android,Multithreading,Android Fragments,有人能解释为什么替换线程上的片段有时会导致空白,而不是在屏幕上显示片段吗 public void swapFragment(final CustomFragment fragment) { new Thread(new Runnable() { @Override public void run() { FragmentTransaction ft = activity.getFragmentManager().beginTran

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

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

交换操作仅在源和目标发生冲突时有效 片段属于不同的类

我可以推迟回答和提问

因此,解决办法是:

  • 检查是否已添加相同的片段类(
    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();
    
    }

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

    }

  • 不过,这个问题的确切解决方案还在等待:)


    希望这将帮助您

    将相同的片段B替换为新实例

    交换操作仅在源和目标发生冲突时有效 片段属于不同的类

    我可以推迟回答和提问

    因此,解决办法是:

  • 检查是否已添加相同的片段类(
    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();
    
    }

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

    }

  • 不过,这个问题的确切解决方案还在等待:)

    希望这对你有帮助