java - Android 线程上的 fragment 替换(...)

标签 java android multithreading android-fragments

有人可以解释一下为什么替换线程上的 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.

我可以推迟回答 this和问题this

所以,解决方法是:

  1. 检查是否已添加相同的 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();
    

    }

  2. 检查是否已添加相同的 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/

相关文章:

java - 我想将此 C 代码转换为 java 代码,但我在输入数组时遇到问题

java drawOval 重复的圆圈

java - Android不幸的应用程序已停止?

java - android中recyclerview的分页

java - 线程按顺序运行

java - 如何构造 JTextArea

java - 为什么子类转换为父类型默认为私有(private)实例方法的父版本,而不是其他实例方法?

android - 如何点亮屏幕?

c++ - 具有使用计数共享指针的多线程竞争条件

C# 使用对成员函数的委托(delegate)来创建新线程