2016-04-22 83 views
0

有人可以解释为什么替换线程上的片段有时会导致空白而不是显示屏幕上的片段?Android的片段替换(...)线程

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)我有我的容器中添加任何片段。其工作

3)然后我使用这个方法来交换实际片段与我的片段 - - 其工作

2)我使用这种方法添加片段

4)但是,当我试图用片段的新实例()掉它它留下空白

我知道我可以在主线程上做,但这只是一个例子。我正在处理不同的问题,但我的问题是更复杂的解释。

编辑:

点4)我把错误的片段 - 这是彪是“碎片A

回答

1

您交换相同的片段其新的实例。

只有当源和目标 片段具有不同的类别时,才会使用交换操作。

我可以回答this推迟这一点,并质疑this

所以,解决方法是:

  1. 检查是否相同片段类已经被添加(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. 检查是否相同片段类已经被添加(isAdded()),然后更新其用户界面的内容,否则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(); 
    

    }

不过,确切的解决方案是期待已久的这个问题:)

希望这会帮助你