0

所以我跟着this guide on Android Developers。他們建議使用片段來向用戶顯示設置。在活動中顯示和隱藏SettingsFragment

我創建的XML和字符串和片段:

public class SettingsFragmentApp extends PreferenceFragment{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     addPreferencesFromResource(R.xml.preferences_app); 
    } 
} 

我想表明這是我的MainActivity頁面上,而無需創建另一個活動,只有承載此片段(我認爲谷歌建議後optioon殺死點......爲什麼我應該爲一個片段創建另一個活動?)。所以我增加了一個選項,以MENU和我處理像這樣的MainActivity

 //inside onOptionsItemSelected(MenuItem item) 
     case (R.id.action_settings_user): 
      getFragmentManager().beginTransaction().replace(android.R.id.content, 
        new SettingsFragmentUser()).commit(); 
      return true; 

這樣的設置片段顯示爲預期,但只要用戶點擊後退按鈕退出應用程序,因爲它仍然是在MainActivity

所以問題是我該如何處理後退按鈕,以便保存設置更改並將用戶恢復到MainActivity?

回答

1

如果您想要後退按鈕功能,您必須將Fragment添加到事務中的後退堆棧中。

FragmentManager manger = getSupportFragmentManager(); 
FragmentTransaction transaction = manager.beginTransaction(); 
transaction.replace(R.id.flFragmentContainer, fragment); 
transaction.addToBackStack(null); // Add fragment to back stack. 
transaction.commit(); 

但是這不被推薦。他們建議您使用額外Activity的原因是,您可以使用Activities而不是碎片構建導航堆棧。使用Fragments構建導航堆棧可能會非常快速地出現問題。 Activities只是Fragments的容器。因此,在任何應用程序中,您將擁有許多Activities,除了Fragment之外,不包含任何內容,這些Activities僅用於構建導航堆棧。在真正的大應用程序中,我傾向於編寫一個抽象基礎Activity,它可以實現所需的所有基本功能,並儘可能地在Activity上重複使用。

+0

非常感謝您的意思如果我有很多不同的設置碎片,我可以只用一個Activity來處理它們?如果是的話,你可以分享派生的活動代碼嗎? –

+0

我的意思是你不應該將'Fragments'添加到後端堆棧,而只是在應用的導航層次結構中爲每個級別創建一個'Activity'。對於同一級別的內容,您可以使用「FragmentTransactions」。例如在你的情況下,我會創建一個'SettingsActivity'。當有人在你的應用程序中點擊設置選項時,你打開'SettingsActivity'並在'Fragment'中的這個'Activity'中顯示設置。如果您有多頁設置,則使用多個「碎片」通過此「活動」中的頁面進行翻頁。 –

+0

但是,如果你有一個額外的細節視圖,你會創建一個額外的'活動'。規則是如果你更深層次的內部使用需要另一個'活動',如果你留在同一層次上,你需要另一個'片段'。 –