有人可以解释一下为什么替换线程上的片段有时会导致空白而不是在屏幕上显示该片段吗?
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与其新实例交换。
交换操作仅在源和目标时有效
片段属于不同的类别。
我可以推迟回答this和问题this
因此,解决方法是:
检查是否已经添加了相同的片段类(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()
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();
}
仍然,这个问题的确切解决方案正在等待:)
希望这能够帮到你