使用一个 Activity 托管的片段时如何管理 ActionBar 标题和图标?
How to manage ActionBar title and icon when working with Fragments hosted by one Activity?
我有很多片段都由一个 Activity 托管。 Activity 有带工具栏的 ActionBar、DrawerLayout 和 menu_icon 在关闭抽屉时打开。在一个片段中,我显示项目列表,当用户单击一个片段时,我将显示该项目的 DetailFragment。
我想要的是将用户在 DetailFragment 中时的 menu_icon 替换为 back_icon 并设置适当的标题,当用户单击此 back_icon 我想从中弹出该 DetaiFragment返回堆栈并再次显示 home_icon。因此,根据当前 Fragment,单击主页和后退图标的行为必须有所不同。
而且我不想对 DetailFragment 使用 Activity。有没有一种方法可以在一个地方管理 ActionBar 图标和操作(托管 Activity)?
我认为您可以只使用 getActivity()
来获取对 activity 的引用。然后当然你可以用 getActivity().setTitle("Details")
设置标题并用 getActivity().getActionBar().setIcon(R.drawable.back_icon)
更改图标。
编辑:您还可以使用它来启用片段中的后退按钮。将它放在 onCreate() 方法中。您可以使用 getSupportActionBar() 实现兼容性。
getActivity().getActionBar().setHomeButtonEnabled(true);
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
我在这里找到了答案:
在托管 Activity 上的 onCreate 中,在设置工具栏和抽屉后,我初始化了后台堆栈更改的侦听器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupToolbar(R.drawable.ic_menu);
setupNavigationDrawer();
getSupportFragmentManager().addOnBackStackChangedListener(this);
}
其余代码看起来与原始答案几乎相同:
@Override
public void onBackStackChanged() {
shouldDisplayHomeUp();
}
public void shouldDisplayHomeUp() {
//Enable Up button only if there are entries in the back stack
FragmentManager fragmentManager = getSupportFragmentManager();
int count = fragmentManager.getBackStackEntryCount();
Fragment fr = fragmentManager.findFragmentById(R.id.flContent);
String tag = fr.getTag();
boolean canGoBack = count > 0;
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeAsUpIndicator(canGoBack ? R.drawable.ic_arrow_back : R.drawable.ic_menu);
actionBar.setTitle(tag);
}
}
@Override
public boolean onSupportNavigateUp() {
boolean canGoBack = getSupportFragmentManager().getBackStackEntryCount() > 0;
if (canGoBack) {
navigationController.navigateBack();
} else {
mDrawerLayout.openDrawer(Gravity.START);
}
return true;
}
@Override
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
closeDrawer();
} else {
super.onBackPressed();
}
}
我有很多片段都由一个 Activity 托管。 Activity 有带工具栏的 ActionBar、DrawerLayout 和 menu_icon 在关闭抽屉时打开。在一个片段中,我显示项目列表,当用户单击一个片段时,我将显示该项目的 DetailFragment。
我想要的是将用户在 DetailFragment 中时的 menu_icon 替换为 back_icon 并设置适当的标题,当用户单击此 back_icon 我想从中弹出该 DetaiFragment返回堆栈并再次显示 home_icon。因此,根据当前 Fragment,单击主页和后退图标的行为必须有所不同。
而且我不想对 DetailFragment 使用 Activity。有没有一种方法可以在一个地方管理 ActionBar 图标和操作(托管 Activity)?
我认为您可以只使用 getActivity()
来获取对 activity 的引用。然后当然你可以用 getActivity().setTitle("Details")
设置标题并用 getActivity().getActionBar().setIcon(R.drawable.back_icon)
更改图标。
编辑:您还可以使用它来启用片段中的后退按钮。将它放在 onCreate() 方法中。您可以使用 getSupportActionBar() 实现兼容性。
getActivity().getActionBar().setHomeButtonEnabled(true);
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
我在这里找到了答案:
在托管 Activity 上的 onCreate 中,在设置工具栏和抽屉后,我初始化了后台堆栈更改的侦听器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupToolbar(R.drawable.ic_menu);
setupNavigationDrawer();
getSupportFragmentManager().addOnBackStackChangedListener(this);
}
其余代码看起来与原始答案几乎相同:
@Override
public void onBackStackChanged() {
shouldDisplayHomeUp();
}
public void shouldDisplayHomeUp() {
//Enable Up button only if there are entries in the back stack
FragmentManager fragmentManager = getSupportFragmentManager();
int count = fragmentManager.getBackStackEntryCount();
Fragment fr = fragmentManager.findFragmentById(R.id.flContent);
String tag = fr.getTag();
boolean canGoBack = count > 0;
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeAsUpIndicator(canGoBack ? R.drawable.ic_arrow_back : R.drawable.ic_menu);
actionBar.setTitle(tag);
}
}
@Override
public boolean onSupportNavigateUp() {
boolean canGoBack = getSupportFragmentManager().getBackStackEntryCount() > 0;
if (canGoBack) {
navigationController.navigateBack();
} else {
mDrawerLayout.openDrawer(Gravity.START);
}
return true;
}
@Override
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
closeDrawer();
} else {
super.onBackPressed();
}
}