我有很多片段都由一个Activity托管。 Activity有ActionBar,Toolbar,DrawerLayout和menu_icon在关闭的抽屉上打开。在一个片段中,我显示了项目列表,当用户点击其中一个时,我正在显示该项目的DetailFragment。
我想要的是当用户在DetailFragment中时替换menu_icon到back_icon并设置适当的标题,当用户点击这个back_icon时我想从backstack弹出那个DetaiFragment并再次显示home_icon。因此,点击主页和背面图标必须根据当前片段的不同而有所不同。
我不想使用Activity for DetailFragment。是否有办法在一个地方管理ActionBar图标和操作(托管活动)?
答案 0 :(得分:0)
我认为您可以使用getActivity()
来获取对活动的引用。然后,您当然可以使用getActivity().setTitle("Details")
设置标题,并使用getActivity().getActionBar().setIcon(R.drawable.back_icon)
更改图标。
编辑:您也可以使用它来启用片段中的后退按钮。将它放在onCreate()方法中。并且您可以使用getSupportActionBar()来实现兼容性。
getActivity().getActionBar().setHomeButtonEnabled(true);
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
答案 1 :(得分:0)
我在这里找到答案:https://stackoverflow.com/a/20314570/5222156
在托管活动的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();
}
}