Android NavigationView 更改标题 onBackPressed
Android NavigationView change title onBackPressed
我有一个 NavigationView
通过单击它的项目并设置 toolbar
的标题和项目的名称来更改某些 Fragment
:
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);
}
并尝试通过将其附加到片段中来在片段中使用它:
@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");
不过,我很高兴看到,如何通过界面实现它。
你的 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();
}
你应该考虑让你的片段设置标题。 IE。像这样定义接口:
interface HostContract {
setTitle(String title);
}
并让您的 activity 实施它。然后在每个片段中,您应该在片段的 onResume()
中调用 ((HostContract)getActivity).setTitle()
。通过这种方式,您可以在片段进入游戏时设置标题(无论是因为它是新添加的,还是因为您从后台获取了之前的片段,这应该可以解决您的问题。这基本上就是您需要做的所有事情。
我有一个 NavigationView
通过单击它的项目并设置 toolbar
的标题和项目的名称来更改某些 Fragment
:
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);
}
并尝试通过将其附加到片段中来在片段中使用它:
@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");
不过,我很高兴看到,如何通过界面实现它。
你的 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();
}
你应该考虑让你的片段设置标题。 IE。像这样定义接口:
interface HostContract {
setTitle(String title);
}
并让您的 activity 实施它。然后在每个片段中,您应该在片段的 onResume()
中调用 ((HostContract)getActivity).setTitle()
。通过这种方式,您可以在片段进入游戏时设置标题(无论是因为它是新添加的,还是因为您从后台获取了之前的片段,这应该可以解决您的问题。这基本上就是您需要做的所有事情。