我正在與方向變化的片段損失鬥爭。 起初,我的碎片似乎對方向變化反應良好,沒有什麼是錯的。 但是,例外情況是當我回到以前製作的片段。因爲我正在檢查我的分片處理器活動。片段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);
}
有什麼辦法可以解決這個問題嗎?只有改變方向後纔會發生。
我知道我可以通過更改Android清單做到這一點,但是這不是處理一個合法的方式片段在我看來。它只是防止android使用它的本地方向處理。 我正在尋找一種方法來檢索片段,因爲android似乎能夠通過標籤找到它們,但似乎並沒有保存該特定片段的數據。 我還發現了一種不同的解決方法,萬一我不需要保留我的片段中的任何數據,只需刪除和添加片段而不是附加和分離,但是我無法保留數據。 – Dethrax
儘管如此,我已經嘗試了您的解決方案,但遇到了即時問題。我一直在製作一個動態UI,這意味着它從一個窗格切換到兩個窗格(端口到地面),反之亦然。 使用此解決方案,它不會更改佈局,因爲它不會被重新創建。我通過onCreateView調用了xml佈局,因此我認爲這個解決方案不適合我;/ – Dethrax
謝謝,您的觀點非常好。你在我的應用程序中引發問題。我有另一個建議給你,我沒有嘗試,但我認爲會工作..檢查[this](http://developer.android.com/guide/topics/resources/runtime-changes.html)onconfigurationChange附加/添加/從backstack中刪除你的最後一個片段。希望這個幫助。 – ovluca