线程上的Android片段替换(...)

Posted

技术标签:

【中文标题】线程上的Android片段替换(...)【英文标题】:Android fragment replace(...) on thread 【发布时间】:2016-08-15 22:58:09 【问题描述】:

谁能解释一下为什么在线程上替换片段有时会导致空白而不是在屏幕上显示片段?

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

【问题讨论】:

【参考方案1】:

您正在用它的新实例交换相同的片段 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();
    

仍然等待这个问题的确切解决方案:)

希望对你有帮助

【讨论】:

以上是关于线程上的Android片段替换(...)的主要内容,如果未能解决你的问题,请参考以下文章

Android studio 动态片段根据日期

如何从一个片段导航到另一个片段?

片段替换显示两个片段

如何在android studio中用另一个片段替换一个片段

如何用 ViewPager 中的另一个片段替换 Android 片段?

需要为某些片段禁用 CollapsingToolbarLayout 上的展开