Я могу легко сделать это, когда я использую onCreateOptionsMenu
или onOptionsItemSelected
.
Но у меня есть кнопка где-то на экране, и при нажатии этой кнопки она должна включать/отключать пункты контекстного меню.
Я могу легко сделать это, когда я использую onCreateOptionsMenu
или onOptionsItemSelected
.
Но у меня есть кнопка где-то на экране, и при нажатии этой кнопки она должна включать/отключать пункты контекстного меню.
В любом случае документация охватывает все.
Как только действие будет создано, Вызов метода
onCreateOptionsMenu()
только один раз, как описано выше. система сохраняет и повторно используетMenu
вас определите в этом методе, пока деятельность разрушается. Если ты хочешь изменить меню параметров в любое время после он сначала создан, вы должны переопределить методonPrepareOptionsMenu()
. Это передает вам объект меню, поскольку он в настоящее время существует. Это полезно, если вы хотите удалить, добавить, отключить или включить пункты меню в зависимости от текущее состояние вашего приложения.
например.
@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()
.
Во всех версиях 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);
}
}
Вы можете сохранить элемент как переменную при создании меню параметров, а затем изменить его свойства по своему усмотрению.
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);
}
упростить версию @Vikas
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
menu.findItem(R.id.example_foobar).setEnabled(isFinalized);
return true;
}
лучшее решение когда вы выполняете на ящике навигации
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.setGroupVisible(0,false);
return true;
}
Как обновить текущее меню, чтобы включить или отключить элементы при выполнении 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);
}
Теперь, когда моя активность начинается, onCreateOptionsMenu()
будет вызываться только один раз, и все мои элементы исчезнут, потому что я установил для них состояние в начале.
Затем я создаю AsyncTask, где я устанавливаю эту переменную состояния в 0 в моем onPostExecute()
Этот шаг очень важен!
Когда вы вызываете 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
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item_id:
//Your Code....
item.setEnabled(false);
break;
}
return super.onOptionsItemSelected(item);
}
@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;
}
Если видно меню
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>
Как правило, можно изменять свойства ваших просмотров во время выполнения:
(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();
}
}
Я надеюсь, что это поможет