0

如何在两个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;
    }
4

3 回答 3

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;
    }
于 2013-08-14T14:49:42.417 回答
1

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

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

你需要的是某种标志来知道要创建什么菜单

于 2013-08-14T14:06:17.610 回答
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;
    }
}
于 2016-03-17T21:43:47.110 回答