Android导航抽屉错误的工具栏标题onResume

时间:2017-08-31 21:15:21

标签: android android-fragments navigation-drawer android-lifecycle

我的应用程序的主要活动中有一个导航抽屉。在活动的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。感谢。

2 个答案:

答案 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