在处理由一个Activity托管的Fragments时,如何管理ActionBar标题和图标?

时间:2017-11-07 08:21:28

标签: android android-fragments android-actionbar android-toolbar

我有很多片段都由一个Activity托管。 Activity有ActionBar,Toolbar,DrawerLayout和menu_icon在关闭的抽屉上打开。在一个片段中,我显示了项目列表,当用户点击其中一个时,我正在显示该项目的DetailFragment。

我想要的是当用户在DetailFragment中时替换menu_icon到back_icon并设置适当的标题,当用户点击这个back_icon时我想从backstack弹出那个DetaiFragment并再次显示home_icon。因此,点击主页和背面图标必须根据当前片段的不同而有所不同。

我不想使用Activity for DetailFragment。是否有办法在一个地方管理ActionBar图标和操作(托管活动)?

2 个答案:

答案 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();
    }
}