【问题标题】:How can I change Action Bar actions dynamically?如何动态更改操作栏操作?
【发布时间】:2011-11-26 16:49:53
【问题描述】:

我有一个带有 ActionBar 和标签导航的 Activity。我正在使用拆分模式,因此选项卡位于顶部,操作位于底部栏中。如何动态更改底部操作?我需要这个,因为每个选项卡都有不同的操作。

【问题讨论】:

    标签: android android-actionbar


    【解决方案1】:

    由于操作由活动的选项菜单填充,您可以使用Activity#invalidateOptionsMenu()。这将转储当前菜单并再次调用您的活动的onCreateOptionsMenu/onPrepareOptionsMenu 方法来重建它。

    如果您使用操作栏选项卡来更改片段配置,则有更好的方法。让每个片段管理自己的菜单部分。这些片段应该调用setHasOptionsMenu(true)。当添加或删除具有选项菜单项的片段时,系统将自动使选项菜单无效,并调用每个片段的onCreateOptionsMenu/onPrepareOptionsMenu 方法以及活动的方法。这样每个片段都可以管理自己的项目,您无需担心手动执行菜单切换。

    【讨论】:

    • 请注意:setHasOptionsMenu() 应根据documentation 在onCreate 中调用。
    • 这实际上不是一个要求。可以从那里调用它,在许多情况下它是一个很好的地方,但是如果片段已经被添加并且没有隐藏,那么活动的选项菜单将失效并反映新的状态。
    • 我同意你的观点,但是文件并没有让它听起来像那样。 “但是,为了让此方法接收呼叫,您必须在 onCreate() 期间调用 setHasOptionsMenu() ...”。我认为他们的意思是你必须调用 setHasOptionsMenu() 但他们无意中让它听起来像在 onCreate() 期间也是一个要求。
    • 如果您已经用 true 调用过一次 setHasOptionsMenu 并且想要更新它们,那么调用 setHasOptionsMenu 将不起作用。至少这在 Android 支持库 v4 中失败了。在这种情况下,无论如何,请使用 getActivity().supportInvalidateOptionsMenu() 这就是 setHasOptionsMenu 在内部所做的。
    • 没错。如果发生了变化,使选项菜单无效是一种可行的方法。
    【解决方案2】:

    Activity.invalidateOptionsMenu() 需要 API 级别 11。 有一个向后兼容的更简单的解决方案:

    最初将 MenuItem 添加到菜单,但将其 visibility 设置为 false。 在需要时将可见性设置为 true,使用 MenuItem.setVisible()

    【讨论】:

    • 谢谢。以防万一帮助别人...把MenuItem refreshItem = menu.findItem(R.id.action_refresh); refreshItem.setVisible(false);放在你的onCreateOptionsMenu
    • @AlvaroSantisteban 或 "android:visible"="false" 在 xml 中
    【解决方案3】:

    ActionMode.invalidate() 成功了。它导致onPrepareActionMode() 再次被调用。

    Activity#invalidateOptionsMenu() 确实不导致在使用多选列表项时调用onPrepareActionMode()。

    【讨论】:

    • 如何获得动作模式?我只有ActionBar
    • ActionMode是onPrepareActionMode(...)中的第一个参数:goo.gl/tMyBx
    • 我从没听说过onPrepareAction
    • @IgorGanapolsky - 我回答了动作模式方式,意思是 CAB - 上下文动作栏。它是在对选定的列表项进行操作时,从而更改操作列表。
    【解决方案4】:

    Activity.invalidateOptionsMenu() 需要 API 级别 11。使用它的支持库版本supportInvalidateOptionsMenu()。

    AppCompatActivity activity = (AppCompatActivity) getActivity();
    activity.supportInvalidateOptionsMenu();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多