更改 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);
}
我的地图片段上显示了一个操作栏,我向其中添加了一个放大按钮。选择后我想用缩小按钮替换它。
选择缩放时,显然是按菜单项选择为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);
}