Android: 如何启用/禁用按钮点击选项菜单项?

我可以很容易地做到这一点,当我使用 onCreateOptionsMenuonOptionsItemSelected方法。

但是我在屏幕的某个地方有一个按钮,点击这个按钮,它应该启用/禁用上下文菜单项。

212941 次浏览

通常可以在运行时更改视图的属性:

(Button) item = (Button) findViewById(R.id.idBut);

然后..。

item.setVisibility(false)

但是

如果你想从 ContextMenu 中修改选项的可见性,按下按钮,你可以激活一个标志,然后在 onCreateContextMenu 中你可以做这样的事情:

 @Override
public void onCreateContextMenu(ContextMenu menu,
View v,ContextMenu.ContextMenuInfo menuInfo) {


super.onCreateContextMenu(menu, v, menuInfo);


menu.setHeaderTitle(R.string.context_title);


if (flagIsOn()) {
addMenuItem(menu, "Option available", true);
} else {
Toast.makeText(this, "Option not available", 500).show();
}


}

希望这个能帮上忙

无论如何,文件涵盖了所有的东西。

在运行时更改菜单项

一旦创建了活动,则 方法调用 只有一次,如上所述 系统保持和重用的 Menu你 在此方法中定义,直到 活动被摧毁,如果你想的话 之后随时更改选项菜单 它是最初创建的,你必须重写 onPrepareOptionsMenu()法。 这会将 Menu 对象作为 这是有用的,如果 您想要删除、添加、禁用或 启用菜单项,这取决于 应用程序的当前状态。

例如。

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
if (isFinalized) {
menu.getItem(1).setEnabled(false);
// You can also use something like:
// menu.findItem(R.id.example_foobar).setEnabled(false);
}
return true;
}

在 Android 3.0或更高版本中,当菜单项出现在操作栏中时,选项菜单被认为总是处于打开状态。当事件发生并且您想要执行菜单更新时,必须调用 invalidateOptionsMenu()来请求系统调用 onPrepareOptionsMenu()

您可以在创建选项菜单时将项保存为变量,然后随意更改其属性。

private MenuItem securedConnection;
private MenuItem insecuredConnection;


@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.connect_menu, menu);
securedConnection = menu.getItem(0);
insecuredConnection =  menu.getItem(1);
return true;
}


public void foo(){
securedConnection.setEnabled(true);
}

在所有的 android 版本中,最简单的方法是: 使用这个来显示一个禁用的菜单动作图标,同时也禁用它的函数功能:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {


MenuItem item = menu.findItem(R.id.menu_my_item);


if (myItemShouldBeEnabled) {
item.setEnabled(true);
item.getIcon().setAlpha(255);
} else {
// disabled
item.setEnabled(false);
item.getIcon().setAlpha(130);
}
}

最好的解决办法 当你在导航抽屉上执行时

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.setGroupVisible(0,false);
return true;
}

简化@Vikas 版本

@Override
public boolean onPrepareOptionsMenu (Menu menu) {


menu.findItem(R.id.example_foobar).setEnabled(isFinalized);
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.home, menu);
return false;
}
  @Override
public boolean onOptionsItemSelected(MenuItem item) {


switch (item.getItemId()) {


case R.id.item_id:


//Your Code....


item.setEnabled(false);
break;
}
return super.onOptionsItemSelected(item);
}

如何更新当前菜单,以便在完成 AsyncTask 时启用或禁用这些项。

在我的用例中,我需要在 AsyncTask 加载数据时禁用菜单,然后在加载所有数据后,我需要再次启用所有菜单,以便让用户使用它。

这阻止了应用程序让用户点击菜单项,而数据加载。

首先,我声明一个状态变量,如果该变量为0,则显示菜单,如果该变量为1,则隐藏菜单。

private mMenuState = 1; //I initialize it on 1 since I need all elements to be hidden when my activity starts loading.

然后在我的 onCreateOptionsMenu()我检查这个变量,如果它是1,我禁用所有的项目,如果不是,我只是显示它们所有

 @Override
public boolean onCreateOptionsMenu(Menu menu) {


getMenuInflater().inflate(R.menu.menu_galeria_pictos, menu);


if(mMenuState==1){
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(false);
}
}else{
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(true);
}
}


return super.onCreateOptionsMenu(menu);
}

现在,当我的 Activity 启动时,onCreateOptionsMenu()只会被调用一次,所有的项目都会消失,因为我在开始时为它们设置了状态。

然后我创建一个 AsyncTask,在这里我将状态变量在 onPostExecute()中设置为0

这一步非常重要!

当您调用 invalidateOptionsMenu();时,它将重新启动 onCreateOptionsMenu();

所以,在将我的状态设置为0之后,我只是重新绘制了所有的菜单,但是这次我的变量是0,也就是说,所有的菜单都会在所有的异步过程完成之后显示出来,然后我的用户就可以使用菜单了。

 public class LoadMyGroups extends AsyncTask<Void, Void, Void> {


@Override
protected void onPreExecute() {
super.onPreExecute();
mMenuState = 1; //you can set here the state of the menu too if you dont want to initialize it at global declaration.


}


@Override
protected Void doInBackground(Void... voids) {
//Background work


return null;
}


@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);


mMenuState=0; //We change the state and relaunch onCreateOptionsMenu
invalidateOptionsMenu(); //Relaunch onCreateOptionsMenu


}
}

结果

enter image description here

如果可见菜单

menu.findItem(R.id.id_name).setVisible(true);

如果隐藏菜单

menu.findItem(R.id.id_name).setVisible(false);

一个老问题的更现代的答案是:

MainActivity.kt

private var myMenuIconEnabled by Delegates.observable(true) { _, old, new ->
if (new != old) invalidateOptionsMenu()
}


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)


findViewById<Button>(R.id.my_button).setOnClickListener { myMenuIconEnabled = false }
}


override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main_activity, menu)
return super.onCreateOptionsMenu(menu)
}


override fun onPrepareOptionsMenu(menu: Menu): Boolean {
menu.findItem(R.id.action_my_action).isEnabled = myMenuIconEnabled
return super.onPrepareOptionsMenu(menu)
}

menu_main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_my_action"
android:icon="@drawable/ic_my_icon_24dp"
app:iconTint="@drawable/menu_item_icon_selector"
android:title="My title"
app:showAsAction="always" />
</menu>

menu_item_icon_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?enabledMenuIconColor" android:state_enabled="true" />
<item android:color="?disabledMenuIconColor" />

attrs.xml

<resources>
<attr name="enabledMenuIconColor" format="reference|color"/>
<attr name="disabledMenuIconColor" format="reference|color"/>
</resources>

styles.xml or themes.xml

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="disabledMenuIconColor">@color/white_30_alpha</item>
<item name="enabledMenuIconColor">@android:color/white</item>

我所做的就是在 onCreateOptionsMenu中保存一个菜单参考。这与 nir 的答案类似,只是我没有保存每个单独的项目,而是保存了整个菜单。

声明菜单 Menu toolbarMenu;

然后在 onCreateOptionsMenu中将菜单保存到您的变量

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

现在你可以随时访问你的菜单和它的所有项目。 toolbarMenu.getItem(0).setEnabled(false);