有人可以解释一下为什么替换线程上的 fragment 有时会导致空白而不是在屏幕上显示 fragment 吗?
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) 我的容器内没有添加任何 fragment 。
2)我正在使用此方法添加 fragment A - 它的工作原理
3)然后我使用此方法将实际 fragment A 与我的 fragment B 交换 - 它的工作原理
4) 但是当我尝试将其与 fragment A 的新实例 (!!!) 交换时,它会留下空白
我知道我可以在主线程上执行此操作,但这只是一个示例。我正在处理不同的问题,但我的问题解释起来更复杂。
编辑:
在第 4 点)我放置了错误的 fragment - 它被修改为“ fragment A”
最佳答案
您正在将同一个 fragment B 与其新实例交换。
Swapping operation will work only when source and destination fragments are of different classes.
所以,解决方法是:
检查是否已添加相同的 fragment 类 (
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();
}
检查是否已添加相同的 fragment 类 (
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();
}
仍然等待这个问题的确切解决方案:)
希望这对您有帮助
关于java - Android 线程上的 fragment 替换(...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36791663/