使用一个 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();
    }
}