【问题标题】:Swap/Switch Android ActionBar items in onOptionsItemSelected method在 onOptionsItemSelected 方法中交换/切换 Android ActionBar 项目
【发布时间】:2013-08-14 14:02:14
【问题描述】:

如何在两个ActionBar 项目之间交换/切换?

我的操作栏中目前有两个项目,如下面的第一张图片所示 - 请参阅“网格”和“时间线”图标。

我只想显示一个,当用户触摸它时,它应该与另一个交换。所以说网格项目正在显示,并且用户触摸它,时间线项目应该显示并且网格项目应该消失。就像第二张图片一样。

我已经尝试过了,但它似乎不起作用 - 没有发生交换。

private static final int SHOW_AS_ACTION_NEVER = 0;
private static final int SHOW_AS_ACTION_IF_ROOM = 1;
private static final int SHOW_AS_ACTION_ALWAYS = 2;

private Menu menu;
private MenuItem itemGrid;
private MenuItem itemTimeline;

//...

@Override
public boolean onCreateOptionsMenu(Menu m) {
        // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.actionbar, m);

    menu = m;

    itemTimeline = menu.findItem(R.id.action_timeline);
    itemTimeline.setShowAsAction(SHOW_AS_ACTION_NEVER);

    return true;
    }

@Override
public boolean onOptionsItemSelected(MenuItem mi) {
    switch (mi.getItemId()) {
    case R.id.action_timeline:
        Toast.makeText(this, "Action grid selected", Toast.LENGTH_SHORT).show();

        itemTimeline = menu.findItem(R.id.action_timeline);
        itemTimeline.setShowAsAction(SHOW_AS_ACTION_NEVER);             

        itemGrid = menu.findItem(R.id.action_grid);
        itemGrid.setShowAsAction(SHOW_AS_ACTION_ALWAYS);

        break;
    case R.id.action_settings:
        Toast.makeText(this, "Action settings selected", Toast.LENGTH_SHORT).show();
        break;

        default:
        break;
        }

    return true;
    }

【问题讨论】:

    标签: android android-actionbar swap


    【解决方案1】:

    您需要做的是使操作栏菜单无效,以便使用invalidateOptionsMenu() 重新创建它

    这会回调onCreateOptionsMenu 以再次创建菜单。

    你需要一些标志来知道要创建什么菜单

    【讨论】:

      【解决方案2】:

      感谢您的回答 tyczj,但我通过像这样切换项目的可见性解决了我的问题:

      @Override
      public boolean onCreateOptionsMenu(Menu m) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.actionbar, m);             
          menu = m;
      
          itemTimeline = menu.findItem(R.id.action_timeline);
          itemGrid = menu.findItem(R.id.action_grid);     
          return true;
          }
      
      @Override
      public boolean onOptionsItemSelected(MenuItem mi) {
          switch (mi.getItemId()) {
          case R.id.action_timeline:                
              itemTimeline = menu.findItem(R.id.action_timeline);
              itemTimeline.setVisible(false);     
      
              itemGrid = menu.findItem(R.id.action_grid);
              itemGrid.setVisible(true);
      
              break;
          case R.id.action_grid:                
              itemTimeline = menu.findItem(R.id.action_timeline);
              itemTimeline.setVisible(true);  
      
              itemGrid = menu.findItem(R.id.action_grid);
              itemGrid.setVisible(false);
      
              break;              
          default:
          break;
          }
      

      【讨论】:

        【解决方案3】:

        使用我的切换功能:)

        private Menu menu;
        private boolean isGridtView
        
        //----------------------------------
        
        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            inflater.inflate(R.menu.menu_items, menu);
            this.menu = menu;
        }
        
        //-----------------------------------
        
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
        
            switch (id){
                case R.id.action_change_layoutManager:
                    // swap between two options
                    toggle();
                    return true;
        
            }
        
            return super.onOptionsItemSelected(item);
        }    
        
        //---------------------------------- 
        
        private void toggle() {
            MenuItem item = menu.findItem(R.id.action_change_layoutManager);
            if (!isGridtView) {
                // change layout manager type
                setRecyclerViewLayoutManager(LayoutManagerType.LINEAR_LAYOUT_MANAGER);
        
                item.setIcon(R.drawable.ic_view_grid_24dp);
                isGridtView = true;
            } else {
                // change layout manager type
                setRecyclerViewLayoutManager(LayoutManagerType.GRID_LAYOUT_MANAGER);
        
                item.setIcon(R.drawable.ic_view_list_24dp);
                isGridtView = false;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-25
          • 1970-01-01
          • 2016-02-16
          • 2016-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多