【问题标题】:Change AppBar's icons depending on the Context (Fragments)根据上下文(片段)更改 AppBar 的图标
【发布时间】:2018-12-11 23:57:56
【问题描述】:

我的 MainActivity 上有我的 AppBar。我的 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,但它应该比这更容易,不是吗?

【问题讨论】:

    标签: java android android-fragments appbar


    【解决方案1】:

    如果您的AppBar 与某些Fragments 不同,则应将AppBar 放在Fragment 中。现在,您可能可以使用FragmentTransactions 更改您的AppBar,但稍后当您构建备份/向上导航或深度链接时,它会开始中断,您会希望将它放在片段中从一开始。

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

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

    【讨论】:

    • 感谢您的回复。我不太明白为什么不建议在活动中使用 AppBar 的理由,而正确的使用选项是分别在每个片段中。我会记住这一点
    • 我已经编辑了答案以详细说明理由。
    【解决方案2】:

    在您的主要活动中添加一个方法,如下所示:

    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>
    

    对于其他自定义图标,您可以简单地通过他们的视图进行更新。 希望对您有所帮助。

    【讨论】:

    • 我没有方法“.setIcon”。为什么?也许是因为我使用 support.v7.wiidget.Toolbar ?
    • 试试toolbar.setNavigationIcon(R.drawable.my_icon);如果您尝试通过流图标更改操作,则必须使用样式。
    • setNavigationIcon 从左侧更改图标。我需要在右侧设置新图标,我将使用这些图标进行操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2019-11-13
    • 2023-03-21
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多