我的应用程序的主要活动中有一个导航抽屉。在活动的onCreate方法中,我初始化其中一个片段:
@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。感谢。
答案 0 :(得分: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");
}
答案 1 :(得分:0)
如果您不想每次都重新创建片段,则应使用saveInstanceState,如下所述:https://stackoverflow.com/a/17135346/1505074