[英]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与其新实例交换。
交换操作仅在源片段和目标片段属于不同类时才有效。
因此,解决方法是:
检查是否已经添加了相同的片段类( 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();
}
仍然,这个问题的确切解决方案正在等待:)
希望这个能对您有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.