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