根据上下文(片段)更改 AppBar 的图标

Change AppBar's icons depending on the Context (Fragments)

我的 AppBar 在我的 MainActivity 上。我的 MainActivity 有一个类似于片段容器的布局。

我想要完成的是,我希望我的 AppBar 图标根据当前位于顶部的 Fragment 进行更改。

像这样:

switch (item.getItemId()){
    case R.id.semanario:
        fragmentTransaction.replace(R.id.viewPagerMainContenedor, new FragmentSemanario());
        fragmentTransaction.addToBackStack(null).commit();
        myToolbar.SETICON(R.drawable.iconExample) (And how to change the xml atributte "app:showAsAction = always)
        break;

我考虑过为每个片段制作一个 AppBar,但它应该比这更容易,不是吗?

如果您的 AppBar 与某些 Fragments 不同,您应该将 AppBar 放在 Fragment 中。现在你可能能够用 FragmentTransactions 来改变你的 AppBar 但稍后当你构建 back/up 导航或深度 linking 时它会开始崩溃并且您会希望从一开始就将其放入 Fragment 中。

编辑:当用户点击菜单项时,您知道 Fragment 用户正在导航到什么,因为您自己正在做 FragmentTransaction。但是,当用户按下后退按钮时,Android 将为您执行 FragmentTransaction 并且判断用户正在导航到什么 Fragment 变得更加困难。您可以遍历 FragmentManager 中的所有 Fragments 并检查哪些 Fragment 可见,但可能同时有多个 Fragments 可见(例如 ViewPager 或平板电脑视图)。当用户通过深层 link 进入您的应用程序时,管理 Fragments 和后台堆栈已经成为 *** 的痛点。

当您的应用增长时,导航会变得越来越复杂。您未来的自己会感谢您将 AppBar 放在 Fragment 而不是 Activity 中,因为您不必担心它与当前显示的 Fragment 保持同步].

在你的 main activity 中添加一个方法,如下所示:

updateToolbar(int title, int drawable){
 toolbar.setTitle(title);
 toolbar.setIcon(drawable);
}

然后从您的片段中调用此方法:

getActivity().updateToolbar(title,R.drawable.icon);

要更改操作溢出图标:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
<item name="actionOverflowButtonStyle">@style/OverFlow</item>
</style>

<style name="OverFlow" 
parent="Widget.AppCompat.ActionButton.Overflow">
<item name="android:src">@drawable/my_overflow_menu</item>
</style>

对于其他自定义图标,您只需通过他们的视图进行更新即可。 希望对你有帮助。