0

我在我的應用程序的主要活動中有一個導航抽屜。在活動的onCreate方法初始化我這樣一個片段:Android導航抽屜錯誤的工具欄標題onResume

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if (savedInstanceState == null) { 
     MenuItem menuItem = navigationView.getMenu().findItem(R.id.menu_history); 
     openFragment(menuItem); 
    } 

public void openFragment(MenuItem menuItem){ 
    Fragment newFragment = null; 

    switch (menuItem.getItemId()){ 
     case R.id.menu_history : 
      newFragment = new HistoryFragment(); 
      break; 
     //..... 
    } 

    if (newFragment != null){ 
     //Replace content frame in activity_main.xml with newFragment 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.content_frame, newFragment) 
       .commit(); 

     menuItem.setChecked(true); 
     getSupportActionBar().setTitle(menuItem.getTitle()); 
    } 

    drawerLayout.closeDrawers(); 
} 

這一切運作良好,該片段在啓動時會出現與工具欄是「歷史」的標題。但是,當應用程序進入onPause,然後onResume工具欄標題從「歷史」切換到應用程序名稱。我懷疑這是用的onResume不開放的片段/恢復到以前的狀態正確,因爲當我添加以下行的onResume問題停止一個問題:

@Override 
protected void onResume() { 
    super.onResume(); 
    MenuItem menuItem = navigationView.getMenu().findItem(R.id.menu_history); 
    openFragment(menuItem); 
} 

這種解決方案似乎解決它,但是這意味着它每次應用程序恢復時都必須使用動畫重新加載片段,這不是最佳選擇。有想法該怎麼解決這個嗎?

如果有幫助,重新創建我發現有用的應用程序拆分屏幕的問題,因爲它總是調用onResume。謝謝。

回答

1

裏面你openFragment()方法,你寫的:

getSupportActionBar().setTitle(menuItem.getTitle()); 

這是唯一的改變你工具欄標題的東西。

請注意,該代碼本身與您的Fragment無關。當您的活動被破壞並重新創建時,活動Fragment將被成功(自動)銷燬並由FragmentManager重新創建...但您的openFragment()方法將不會再次運行,因此沒有任何內容會更新您的工具欄的標題。

有很多方法可以解決這個問題。可能正確的做法是從Fragment的生命週期方法中更新工具欄的標題。

編輯:更新工具欄標題的合理位置應在您的分段的onActivityCreated()方法中。這將在片段首次添加時和休閒時運行。例如:

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("hello world"); 
}