根据导航目的地更新 ActionBar 菜单

     2023-04-19     25

关键词:

【中文标题】根据导航目的地更新 ActionBar 菜单【英文标题】:Update ActionBar menu depending on navigation destination 【发布时间】:2019-09-10 23:49:46 【问题描述】:

我想根据我的NavController 的当前目的地更改我的ActionBar 中显示的菜单项。通过“更改”,我的意思是为每个目的地膨胀指定的 menu-xml。

该行为可以与新导航系统更改 ActionBar 标题的集成方式进行比较,具体取决于导航 xml 中目标片段的给定 android:label

到目前为止,我使用新的 Android 导航设置了 ActionBarDrawerLayout 的基本活动。我还创建了所有必要的 XML 文件和片段以在它们之间导航。

...

@Override
protected void onCreate(Bundle savedInstanceState)

    ...    

    this._drawerLayout = this.findViewById(R.id.drawer_layout);

    Toolbar toolbar = this.findViewById(R.id.action_bar);
    this.setSupportActionBar(toolbar);

    ActionBar actionbar = Objects.requireNonNull( this.getSupportActionBar() );
    actionbar.setDisplayHomeAsUpEnabled(true);
    actionbar.setHomeAsUpIndicator(R.drawable.ic_menu);

    NavigationView navigationView = this.findViewById(R.id.navigation_view);
    navigationView.setNavigationItemSelectedListener(menuItem -> 
        menuItem.setChecked(true);
        this._drawerLayout.closeDrawers();

        return true;
    );

    NavController navController = Navigation.findNavController(this, R.id.navigation_host);
    NavigationUI.setupWithNavController(toolbar, navController, this._drawerLayout);


@Override
public boolean onCreateOptionsMenu(Menu menu)

    // Here I inflate the ActionBar menu that is kept between all destinations.
    // Instead of keeping the same menu between all destinations I want to display different menus depending on the destination fragment.
    this.getMenuInflater().inflate(R.menu.actionbar_items, menu);

    return true;


@Override
public boolean onOptionsItemSelected(MenuItem item)

    switch(item.getItemId())
    
        case android.R.id.home:
            this._drawerLayout.openDrawer(GravityCompat.START);
            return true;
        case R.id.appbar_search:
            return true;
    

    return super.onOptionsItemSelected(item);


我考虑在每个目标片段中使用单独的工具栏 但我放弃了这个想法,因为我会失去汉堡图标和后退箭头图标之间的过渡动​​画。

有没有什么方法可以通过新的导航系统或其他方式来实现这一点?

【问题讨论】:

【参考方案1】:

我刚刚测试了这个。在导航库的当前版本 (2.2.2) 中,由每个片段膨胀的菜单项将在您导航时添加和删除。

但默认不调用 onCreateOptionsMenu!为了使事情顺利进行,您必须在初始化期间撒上魔法灰尘并调用setHasOptionsMenu(true)

请注意,由包含的 Activity 膨胀的任何菜单项将始终与当前片段中的菜单项一起出现,因此如果您不想要任何常见的菜单项,最简单的方法可能是不在 Activity 中膨胀菜单。

附注:在Fragment 类中,onCreateOptionsMenu(menu, inflater) 是一个空方法,因此在您的代码中调用super.onCreateOptionsMenu(menu, inflater) 是无操作的。

【讨论】:

【参考方案2】:

我找到了一种方法来实现所需的行为,方法是在扩展更新的布局之前调用menu.clear();。我仍然想知道新导航系统是否有内置的方法来实现这一点。

在我现在使用的目标片段中:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)

    super.onCreateOptionsMenu(menu, inflater);

    menu.clear();
    inflater.inflate(R.menu.toolbar_items_idle, menu);

【讨论】:

设置 ActionBar 上所选项目的标题

】设置ActionBar上所选项目的标题【英文标题】:SettingThetitleoftheItemSelectedonActionBar【发布时间】:2016-03-2906:42:29【问题描述】:您好,我一直在尝试使ActionBar的标题显示我在navigationDrawer中选择的标题。我附上了代码,请帮助我。... 查看详情

手动打开 ActionBar 导航列表

】手动打开ActionBar导航列表【英文标题】:ManuallyopenActionBarnavigationlist【发布时间】:2013-06-3008:49:44【问题描述】:我有一个导航模式设置为NAVIGATION_MODE_LIST的ActionBarSherlock和一个适配器。该列表按预期显示。当用户按下ActionBar中... 查看详情

根据条件更改 ActionBar 中的图标

】根据条件更改ActionBar中的图标【英文标题】:ChangingaiconinActionBardependingonacondition【发布时间】:2012-08-0502:04:12【问题描述】:当用户按下ActionBar上的图标时,我正在更新SQLite数据库中的记录。正在更新的信息是将记录添加到收... 查看详情

个人知识体系(持续更新)

AndroidApp:一、View1.1ActionBar1、ActionBar的home键2、利用代码移除系统自带的标题栏3、Android中层级导航的实现示例4、Android中工具栏菜单使用示例1.2AlertDialog1、禁用AlertDialog的按键1.3LinearLayout1、LinearLayout增加分隔线1.4WebView1、AndroidWebVi... 查看详情

Android:在 ActionBar 中隐藏导航微调器的安全方法?

】Android:在ActionBar中隐藏导航微调器的安全方法?【英文标题】:Android:safewaytohidenavigationspinnerinActionBar?【发布时间】:2013-01-3022:01:02【问题描述】:我想在我的ActionBar中显示一个微调器,使用ActionBar.NAVIGATION_MODE_LIST,但我希望... 查看详情

ActionBar 菜单项的动态可绘制图标? (安卓,ActionBarSherlock)

】ActionBar菜单项的动态可绘制图标?(安卓,ActionBarSherlock)【英文标题】:dynamicdrawableiconforActionBarmenuitem?(Android,ActionBarSherlock)【发布时间】:2012-10-2421:09:18【问题描述】:如何动态更新ActionBarMenuItem的图标以显示带有数字的“... 查看详情

引导导航下拉菜单切换问题

...单时,我添加了一个小的jquery代码,它将自动关闭并转到目的地但如果我在导航中有下拉菜单。这个下拉菜单现在不起作用。当我按下下拉菜单父级以展开其自动关闭菜单时。我无法检查下拉菜单中可用的菜单所以我试图添加一... 查看详情

如果您位于导航图的起始目的地,为啥android jetpack NavigationUI navigateUp 方法仅打开绘图菜单

】如果您位于导航图的起始目的地,为啥androidjetpackNavigationUInavigateUp方法仅打开绘图菜单【英文标题】:WhydoestheandroidjetpackNavigationUInavigateUpmethodonlyopenthedrawmenuifyouareatthestartdestinationofthenavgraph如果您位于导航图的起始目的地,为... 查看详情

根据用户角色和权限显示导航栏 laravel

】根据用户角色和权限显示导航栏laravel【英文标题】:displayingnavbaraccordingtouserrolesandpermisionslaravel【发布时间】:2015-08-2302:42:30【问题描述】:我在laravel5中实现用户角色,我想根据用户权限更新导航栏。默认导航栏具有重定向... 查看详情

java导航抽屉菜单更新标题(代码片段)

查看详情

引导、导航选项卡、下拉菜单;如何根据 URI 设置活动选项卡

】引导、导航选项卡、下拉菜单;如何根据URI设置活动选项卡【英文标题】:Bootstrap,nav-tabs,dropdownmenus;howtosetactivetabbasedonURI【发布时间】:2013-06-1612:10:17【问题描述】:我使用Bootstrap导航选项卡/下拉菜单组件作为我的主要导航... 查看详情

即使手机有硬件菜单按钮,如何始终显示溢出菜单(ActionBar)?

】即使手机有硬件菜单按钮,如何始终显示溢出菜单(ActionBar)?【英文标题】:Howtoalwaysshowoverflowmenu(ActionBar)evenifphonehashardwaremenubutton?【发布时间】:2014-05-0114:52:36【问题描述】:以下是实现的代码。请建议我如何在操作栏中... 查看详情

在 Fragment 中向 ActionBar 添加项目

】在Fragment中向ActionBar添加项目【英文标题】:AddingitemstoActionBarinaFragment【发布时间】:2014-12-1519:10:03【问题描述】:我试图弄清楚如何通过Fragment将项目添加到ActionBar菜单。我的应用程序的MainActivity继承了ActionBarActivity,我希望... 查看详情

导航架构组件 - 导航抽屉

...Fragment将被交换的位置添加NavHostFragment然后添加片段作为目的地我想要主细节导航,即开始目的地->片段2后退按钮->开始目的地开始目的地 查看详情

将微调器添加到 ActionBar(不是导航

】将微调器添加到ActionBar(不是导航【英文标题】:AddingspinnertoActionBar(notNavigation【发布时间】:2012-07-0719:56:24【问题描述】:我使用答案here中的第二个选项向我的ActionBar添加了一个微调器。如何向微调器添加微调器适配器?我... 查看详情

带有导航选项卡的 ActionBar 随屏幕方向改变高度

】带有导航选项卡的ActionBar随屏幕方向改变高度【英文标题】:ActionBarwithnavigationtabschangesheightwithscreenorientation【发布时间】:2012-11-2910:46:34【问题描述】:我的目标是增加纵向模式的ActionBar高度。我目前设置了android:actionBarSize... 查看详情

如何更改工具栏导航和溢出菜单图标(appcompat v7)?

...2015-05-1607:49:59【问题描述】:我很难使用v7工具栏。对于ActionBar来说,曾经是一项简单的任务,现在似乎过于复杂了。无论我设置什么样式,我都无法更改导航图标(打开抽屉)或溢出菜单图标(打开菜单)。所以 查看详情

导航抽屉不适用于导航组件

...描述】:当用户点击菜单项时,导航抽屉不会让用户到达目的地。导航抽屉显示正确,但不起作用。有什么问题?我有一个导航菜单:<?xmlversion="1.0"encoding="utf-8"?><menuxmlns:android= 查看详情