更改 Android 操作栏上项目的属性

Change attributes of items on an Android Actionbar

我的地图片段上显示了一个操作栏,我向其中添加了一个放大按钮。选择后我想用缩小按钮替换它。

选择缩放时,显然是按菜单项选择为onoptionsitemsemem,因此很容易设置其属性:viewZoomIn.setVisibility(viewZoomIn.GONE);我的问题是,我如何获得对操作栏上缩小按钮的引用以将其设置为我想要的 viewZoomOut.setVisibility(viewZoomOut.VISIBLE);?

我想我可以将放大和缩小视图存储为实例变量,并在我膨胀 Actionbar 时捕获它们,如下所示:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    viewZoomIn = findViewById(R.id.zoom_in);
    viewZoomOut = findViewById(R.id.zoom_out);
    return super.onCreateOptionsMenu(menu);

这行不通。

任何关于获取这些按钮的帮助,或关于更好地切换我的 zoom-in/zoom-out 按钮的建议,我们将不胜感激。

它可能显示了,但我对 Java 还很陌生,所以最好能以简单的方式传达任何帮助。

谢谢。

如果要切换 MenuItem 状态,则必须在 onPrepareOptionsMenu(Menu) 而不是 onCreateOptionsMenu(Menu) 中应用可见性逻辑。

private boolean currentlyZoomedIn;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    // called the first time and after each "invalidateOptionsMenu()"
    // if tha Activity is in the "zoomedIn" state, the zoomOut button will be visible
    menu.findItem(R.id.zoom_in).setVisible(!currentlyZoomedIn);
    menu.findItem(R.id.zoom_out).setVisible(currentlyZoomedIn);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.zoom_in:
            // do your logic when zoom_in is clicked
            currentlyZoomedIn = true;
            break;
        case R.id.zoom_out:
            // do your logic when zoom_out is clicked
            currentlyZoomedIn = false;
            break;
    }
    // force the redraw of the menu
    invalidateOptionsMenu();
    return super.onOptionsItemSelected(item);
}

顺便说一下,我建议您只使用一个按钮并仅在 onOptionsItemSelected(MenuItem) 中移动您的逻辑,以避免实例变量和对 invalidateOptionsMenu() 的调用,如下所示:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // zoom_out_in_id is the id for the common button
    if (item.getItemId() == R.id.zoom_out_in_id) {
        // get the curren title
        final CharSequence title = item.getTitle();
        // if the current title is the one of zoom_in button, you have to change its infos to zoom_out ones
        if (title.equals("zoom_in_title")) {
            // do your logic when zoom_in is clicked
            item.setIcon(R.drawable.zoom_out_icon);
            item.setTitle("zoom_out_title");
        } else if (title.equals("zoom_out_title")) {
            // do your logic when zoom_out is clicked
            item.setIcon(R.drawable.zoom_in_icon);
            item.setTitle("zoom_in_title");
        }
    }
    return super.onOptionsItemSelected(item);
}