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"); 
}