2016-04-22 43 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(); 
    

    }

不過,確切的解決方案是期待已久的這個問題:)

希望這會幫助你