2013-11-27 125 views
3

我正在與方向變化的片段損失鬥爭。 起初,我的碎片似乎對方向變化反應良好,沒有什麼是錯的。 但是,例外情況是當我回到以前製作的片段。因爲我正在檢查我的分片處理器活動。片段android方向丟失片段

我選擇使用一個大的if語句而不是switch case,因爲這更多是在我的知識掌握之內。 if語句的處理工作正常,已經用日誌語句進行調試,並且在那裏沒有任何錯誤。以下是處理碎片的代碼,預先使用或創建一個新碎片。

public void fragmentHandle(Fragment fl, Fragment fr, String tl, String tr) { 
    Fragment cFragLeft = manager.findFragmentById(R.id.fragment_left); 
    Fragment cFragRight = manager.findFragmentById(R.id.fragment_right); 

    Fragment checkLeft = manager.findFragmentByTag(tl); 
    Fragment checkRight = manager.findFragmentByTag(tr); 

    FragmentTransaction ft = manager.beginTransaction(); 

    if (cFragLeft != null && cFragRight != null && checkLeft != null 
      && checkRight != null) { 
     ft.detach(cFragRight).detach(cFragLeft).attach(fr).attach(fl) 
       .addToBackStack(null).commit(); 
    } else if (cFragLeft != null && cFragRight != null && checkLeft == null 
      && checkRight == null) { 
     ft.detach(cFragLeft).detach(cFragRight) 
       .add(R.id.fragment_left, fl, tl) 
       .add(R.id.fragment_right, fr, tr).addToBackStack(null) 
       .commit(); 
    } else if (cFragLeft != null && cFragRight != null && checkLeft == null 
      && checkRight != null) { 
     ft.detach(cFragLeft).detach(cFragRight).attach(fr) 
       .add(R.id.fragment_left, fl, tl).addToBackStack(null) 
       .commit(); 
    } else if (cFragLeft != null && cFragRight != null 
      && checkRight == null && checkLeft != null) { 
     ft.detach(cFragLeft).detach(cFragRight).attach(fl) 
       .add(R.id.fragment_right, fr, tr).addToBackStack(null) 
       .commit(); 
    } else { 
     ft.add(R.id.fragment_left, fl, tl).add(R.id.fragment_right, fr, tr) 
       .commit(); 
    } 
} 

當我改變方向,然後導航回到以前保存的片段(第一個if語句)我的兩個左右的片段顯示空白屏幕。只有在案例1被調用時,纔會發生這種情況,即使片段管理器通過標記找到它們,它似乎也不記得那裏存在的片段。

我也一直在檢查我的onCreate,它顯示在下面。

protected void onCreate(Bundle savedInstanceState) { 
    // super.onCreate 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_fragment_handler); 

    if (savedInstanceState == null) { 
     fragmentHandle(nFragLeft, nFragRight, "menuMain", "main"); 
    } 

} 

還包括一個按鈕語句只是爲了完成。沒有使用onClickListeners,並且不確定我是否應該更喜歡使用onClick onClick。

public void sendDestination(View v) { 
    nFragLeft = menudestFrag; 
    nFragRight = destFrag; 
    String tagLeft = "menuDestination"; 
    String tagRight = "destination"; 

    fragmentHandle(nFragLeft, nFragRight, tagLeft, tagRight); 
} 

有什麼辦法可以解決這個問題嗎?只有改變方向後纔會發生。

回答

1

發生這種情況是因爲您的活動在方向更改時重新啓動。

就可以解決這個問題將在清單android:configChanges="orientation|screenSize"(防止重新創建活動時方向改變):

<activity 
     android:name="com.example.MyActivity" 
     android:configChanges="orientation|screenSize" > 
    </activity> 
+0

我知道我可以通過更改Android清單做到這一點,但是這不是處理一個合法的方式片段在我看來。它只是防止android使用它的本地方向處理。 我正在尋找一種方法來檢索片段,因爲android似乎能夠通過標籤找到它們,但似乎並沒有保存該特定片段的數據。 我還發現了一種不同的解決方法,萬一我不需要保留我的片段中的任何數據,只需刪除和添加片段而不是附加和分離,但是我無法保留數據。 – Dethrax

+0

儘管如此,我已經嘗試了您的解決方案,但遇到了即時問題。我一直在製作一個動態UI,這意味着它從一個窗格切換到兩個窗格(端口到地面),反之亦然。 使用此解決方案,它不會更改佈局,因爲它不會被重新創建。我通過onCreateView調用了xml佈局,因此我認爲這個解決方案不適合我;/ – Dethrax

+0

謝謝,您的觀點非常好。你在我的應用程序中引發問題。我有另一個建議給你,我沒有嘗試,但我認爲會工作..檢查[this](http://developer.android.com/guide/topics/resources/runtime-changes.html)onconfigurationChange附加/添加/從backstack中刪除你的最後一個片段。希望這個幫助。 – ovluca