2014-04-04 126 views
0

在我的應用程序中,我有3個片段。Android片段後退按鈕覆蓋其他片段並保持活動

App從[1]開始,用戶只能導航到[2],然後選擇導航到[3]。

由於[3]內心深處,我希望[3]直接回到[1]。

目前我使用addToBackStack(null)調用[2]。由於我不會在[3]上調用addToBackStack,我認爲它會回到[1]。

會發生什麼,[3]返回到[1],但現在兩個片段都顯示爲重疊。片段[3]不會調用onPause()。再次調用片段[2]將在其他頂部顯示[2],而不是清除屏幕。

來回導航會導致應用程序崩潰。有時在打開一個新的片段時,有時候會碰到後退按鈕。始終以「片段已添加」錯誤(後退按鈕非常奇怪,但在切換片段之前也檢查過)。

任何想法可能會導致這種奇怪的行爲?使用addToBackStack或[3]也可以消除這個問題,但並不能解決我的需求。我確實在適當的時候調用所有超級方法。

信息:示例代碼下載在上2.X http://beadsoft.de/android/FragmentTest.zip

相同的行爲,4.2.2。使用ActionBarCompat。

代碼添加片段:

FragmentManager fm = getActivity().getSupportFragmentManager(); 
    Fragment fragment = fm.findFragmentByTag(Fragment_xyz.FRAG_TAG); 
    if (fragment == null) 
     fragment = Fragment_xyz.newInstance(int data); 
    fm.beginTransaction().replace(R.id.container, fragment, Fragment_xyz.FRAG_TAG) 
      .addToBackStack(null).commit() 

回答

0

上有碎片是如何工作的問題。看到上面的應用程序下面的生命週期:

LifeCycle of the App 
start 
04-07 20:34:46.115: D/Fragment_1(15309): onCreateView Fragment_1 
04-07 20:34:46.115: D/Fragment_1(15309): onResume Fragment_1 
Click to open 2 
04-07 20:34:49.148: D/Fragment_1(15309): onPause Fragment_1 
04-07 20:34:49.148: D/Fragment_2(15309): onCreateView Fragment_2 
04-07 20:34:49.148: D/Fragment_2(15309): onResume Fragment_2 
Click to open 3 
04-07 20:34:53.633: D/Fragment_2(15309): onPause Fragment_2 
04-07 20:34:53.633: D/Fragment_3(15309): onCreateView Fragment_3 
04-07 20:34:53.633: D/Fragment_3(15309): onResume Fragment_3 
back Button. Since 3 is not on backstack, app returns to 1 (not pausing 3) 
Here Frag 1 and 3 are running and displayed overlaying! 
04-07 20:35:03.653: D/Fragment_1(15309): onCreateView Fragment_1 
04-07 20:35:03.653: D/Fragment_1(15309): onResume Fragment_1 
back Button on 1 - App exit 
04-07 20:35:23.474: D/Fragment_1(15309): onPause Fragment_1 
04-07 20:35:23.474: D/Fragment_3(15309): onPause Fragment_3 

問題現在與谷歌提出:https://code.google.com/p/android/issues/detail?id=68160

有了這個和導航來回會崩潰的應用程序,因爲FragmentManager基本暫停和恢復錯誤的片段。

0

爲什麼不將每個碎片添加到後臺?相反的:

MyNewFragment f=new MyNewFragment(); 
getSupportFragmentManager().beginTransaction().replace(R.id.container, f).commit(); 

嘗試:

MyNewFragment f=new MyNewFragment(); 
getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.container, f).commit(); 
+0

怎樣的應用程序,然後直接從片段去3比1,當用戶點擊後退按鈕跳過2? –