Android NavigationView更改标题onBackPressed

时间:2016-05-23 14:55:34

标签: android navigation-drawer onbackpressed

我有一个NavigationView,通过点击其项目并使用项目名称设置Fragment的标题来更改某些toolbar

fragmentTransaction = getFragmentManager().beginTransaction();
    int id = item.getItemId();
    switch (id){
        case R.id.studying:
            fragmentTransaction.replace(R.id.container, studyFragment).addToBackStack(null);
            break;
        case R.id.events:
            fragmentTransaction.replace(R.id.container, eventsFragment).addToBackStack(null);
            break;
        case R.id.discount:
            fragmentTransaction.replace(R.id.container, discountsFragment).addToBackStack(null);
            break;
        case R.id.bookmarks:
            fragmentTransaction.replace(R.id.container, bookmarksFragment).addToBackStack(null);
            break;
        case R.id.settings:
            fragmentTransaction.replace(R.id.container, settingsFragment).addToBackStack(null);
            break;
        case R.id.prolong_sign:
            fragmentTransaction.replace(R.id.container, prolongFragment).addToBackStack(null);
            break;
        case R.id.contacts:
            fragmentTransaction.replace(R.id.container, contactsFragment).addToBackStack(null);
            break;
    }
    toolbarTitle.setText(item.getTitle().toString());
    fragmentTransaction.commit();

证明更好的可用性我override onBackPressed方法:

 @Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        FragmentManager fm = getFragmentManager();
        if (fm.getBackStackEntryCount() > 0 && fm.getBackStackEntryCount() != 1) {
            fm.popBackStackImmediate();
        } else if (fm.getBackStackEntryCount() == 1) {
            toolbarTitle.setText("TEST");
            fm.popBackStackImmediate();
        } else {
            super.onBackPressed();
        }
    }
}

如果我回到第一个Fragment,我的toolbarTitle会根据以下情况设置好:

 else if (fm.getBackStackEntryCount() == 1) {
            toolbarTitle.setText("TEST");
            fm.popBackStackImmediate();
        }

但我不知道如何让toolbarTitle在每个onBackPressed上正确更改标题,并在NavigationView中选中前一项。你能帮帮我吗?

修改

我创建了一个界面

public interface OnToolbarTitle {
void setTitle(String title);

}

实施了MainActivity并覆盖了

 @Override
public void setTitle(String title) {
    toolbarTitle.setText(title);
}

并尝试通过将其附加到Fragments中来在Fragments中使用它:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    titleSetter = (OnToolbarTitle) context;
}

@Override
public void onResume() {
    super.onResume();
    titleSetter.setTitle("Test-frag3");
}

但我NullPointerException符合setTitle()方法。

修改

好的,我通过访问片段中的工具栏解决了我的问题。

    View view = getActivity().findViewById(R.id.toolbar);
    TextView title = (TextView) view.findViewById(R.id.toolbar_title);
    title.setText("study lol");

不过,我很高兴看到,我怎样才能通过界面实现它。

2 个答案:

答案 0 :(得分:4)

你应该考虑让你的片段设置标题。即定义界面如:

interface HostContract {
    setTitle(String title);
}

让您的活动实现它。然后在每个片段中,您应该在片段((HostContract)getActivity).setTitle()中调用onResume()。这样你就可以在你的片段进入游戏时设置标题(因为它是新添加的,或者因为你从后台获取了前一个,这可以解决你的问题。而这基本上就是你需要做的。

答案 1 :(得分:0)

你的if ... else应该像

if (fm.getBackStackEntryCount() > 0 && fm.getBackStackEntryCount() != 1) {
        fm.popBackStackImmediate();
        toolbarTitle.setText("TEST");
 } else if (fm.getBackStackEntryCount() == 1) {
        toolbarTitle.setText("TEST");
        fm.popBackStackImmediate();
 } else {
        super.onBackPressed();
 }