【问题标题】:Trying to hide and show menu items on action bar试图在操作栏上隐藏和显示菜单项
【发布时间】:2013-04-13 10:21:00
【问题描述】:

我已经查看了堆栈溢出的问题,但找不到解决方案。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.themenu, menu);
    MenuItem   item = menu.findItem(R.id.menu_settings);
    MenuItem item2 = menu.findItem(R.id.menu_save);
    item.setVisible(isdown);
    item2.setVisible(isdown);
    return true;
}

这会将我的菜单项设置为可见(item1 和 item2)。 onclick 工作正常

public void inflateTextarea() {
    if(isdown == true) {
        isdown = false;
        LinearLayout tl = (LinearLayout)findViewById(R.id.content);
        tl.setVisibility(View.VISIBLE);
        ScaleAnimation scale =  new ScaleAnimation(1, 1, 0, 1);
        scale.setFillAfter(true);
        scale.setDuration(500);
        tl.startAnimation(scale);
    }
}

然后这会将我的 isdown 布尔值设置为 false。堆栈上的人说每次我单击时都应该触发 onPrepareOptionsMenu ,但事实并非如此。 我可以在 onclick 功能上隐藏一个菜单项

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case R.id.menu_settings: 
            Log.v("Log:","edit_item pressed");
            return true;
    }
}

但我有多个需要隐藏的菜单项以及要显示的其他菜单项。 我该怎么办?

【问题讨论】:

    标签: android menu android-actionbar


    【解决方案1】:

    我有一个包含两个项目的菜单,第一个:保存项目,第二个:编辑项目。我想在我进来编辑的时候,一开始“save item”被隐藏了,当我点击“edit item”的时候,显示“save item”。

    所以:

    1. 公开声明项目
    2. onCreateOptionsMenu(Menu menu, MenuInflater inflater)中设置它的值
    3. 将可见性设置为isHidden()
    4. 然后在我想要的任何地方,将可见性设置为isVisible()

    公共区域:

    MenuItem saveItem;
    

    onCreateOptionsMenu:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_detail_products, menu);
        saveItem = (MenuItem) menu.findItem(R.id.action_detail_product_save);
        saveItem.setVisible(isHidden());
    }
    

    我想去哪里:

    saveItem.setVisible(isVisible());
    

    终于如我所愿。

    【讨论】:

      【解决方案2】:

      在你的 FragmentActivity 中试试这个

      public boolean onPreparePanel(int featureId, View view, Menu menu) {
          if(isLeftMenuOpened()) return false;
          return super.onPreparePanel(featureId, view, menu);
      }
      

      方法 FragmentActivity.onPreparePanel 为所有附加的片段创建菜单。您必须返回 true 才能显示菜单;如果返回 false 则不会显示。

      【讨论】:

        【解决方案3】:

        仅更改 isDown 变量是不够的。每次要更改可见性时,都必须调用 setVisible() 方法。该方法不仅仅是设置一个布尔值,所以仅仅改变一个布尔值是行不通的。

        isDown 值更改为false 后,您需要调用invalidateOptionsMenu(),这将通过再次调用onPrepareOptionsMenu() 重新启动菜单。

        试试这个代码使菜单项不可见:

        ...
        isdown = false;
        invalidateOptionsMenu();
        ...
        

        【讨论】:

        • 是的,我知道,但是当我阅读 onPrepareOptionsMenu(Menu menu) { 应该在每次单击菜单项时触发,这会起作用。除非我在功能中有菜单菜单,否则我无法设置可见性,所以这就是我遇到问题的地方
        • 我明白了。编辑帖子以涵盖此内容。
        • 啊哈,这就是我要找的。如果效果不好,我会尝试接受谢谢。
        • 在哪里添加 invalidateOptionsMenu() 方法?
        • 将 isDown 的值更改为 false 后活动中的任何位置
        【解决方案4】:

        试试这个,

        private Menu menu=null;
        @Override
        public void onCreateOptionsMenu(Menu menu,MenuInflater inflater)
        {
            inflater.inflate(R.menu.note_menu, menu);
            this.menu=menu;
        super.onCreateOptionsMenu(menu,inflater);
        menu.findItem(R.id.menuChartNoteEdit).setVisible(isdown);
        menu.findItem(R.id.menuChartOpenNote).setVisible(isdown);
        }
        

        当你想在任何地方隐藏菜单时,在执行onCreateOptionsMenu()之后 然后只需更改 isdown 的值并重复此代码,

        menu.findItem(R.id.menu_settings).setVisible(isdown);
        menu.findItem(R.id.menu_save).setVisible(isdown);
        

        【讨论】:

        • 我听说onPrepareOptionsMenu应该更好,你知道有什么区别吗?
        • 好的,现在我可以将 menu.find 项目放入课堂中的任何函数中了吗?
        • 是的,在你班级的任何地方找到菜单项并隐藏/显示..!,你检查了吗?
        • 我会尝试一下,如果它有效会投票,非常感谢你给我几个小时
        • 两者都有效,但通过使菜单无效的另一个答案更有效,谢谢。
        猜你喜欢
        • 1970-01-01
        • 2013-12-18
        • 2014-06-04
        • 2015-12-21
        • 2012-05-28
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 2018-10-01
        相关资源
        最近更新 更多