在onOptionsItemSelected方法中交换/切换Android ActionBar项

时间:2013-08-14 14:02:15

标签: android android-actionbar swap

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

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

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

enter image description here

我试过这个,但它似乎没有用 - 没有发生交换。

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;
    }

3 个答案:

答案 0 :(得分:1)

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

这会回拨onCreateOptionsMenu再次创建菜单。

您需要的是一些标志,以了解要创建的菜单

答案 1 :(得分:1)

感谢您的回答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;
    }

答案 2 :(得分:0)

使用我的切换功能:)

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;
    }
}