J'ai essayé de griser certains éléments de menu dans OptionsMenu sous certaines conditions afin qu'ils ne puissent pas être exploités, alors je l'ai écrit sous forme de mémorandum
MainFragment.java
private boolean isEnable = true;
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.menu_item, menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
AppCompatActivity activity = (AppCompatActivity) getActivity();
int id = item.getItemId();
switch (id) {
case R.id.menu_first:
activity.getSupportActionBar().invalidateOptionsMenu();
isEnable = false
return true;
case R.id.menu_second:
return true;
}
return super.onOptionsItemSelected(item);
}
Cette fois, il a été implémenté dans Fragment, il est donc décrit dans Fragment
Notez que le menu Options ne sera pas affiché à moins que vous ne fassiez setHasOptionsMenu (true) dans ʻActivity`.
menu_item.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/menu_first"
android:orderInCategory="1"
android:title="Menu 1"
app:showAsAction="never" />
<item
android:id="@+id/menu_second"
android:orderInCategory="2"
android:title="Menu 2"
app:showAsAction="never" />
</menu>
Mettez ʻapp: showAsAction = "never" `pour stocker dans le menu de débordement
MainFragment.java
@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
menu.findItem(R.id.menu_second).setEnabled(isEnable);
}
Si vous n'utilisez pas Toolbar dans votre fichier de mise en page, vous pouvez griser simplement en appuyant sur setEnable, mais si vous utilisez Toolbar, simplementsetEnable ne sera pas grisé, donc Utilisez Thème pour spécifier les attributs de ʻapp: popupTheme`
menu_item_text.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#727272" />
<item android:color="#000000"/>
</selector>
Créez un selector dans le package color, rendez le texte du menu gris quand il est false, et noir sinon.
styles.xml
<style name="AppThemeOverlay.AppBar.Menu" parent="ThemeOverlay.AppCompat.Light">
<item name="android:textColor">@color/menu_item_text</item>
</style>
Créez un thème avec styles pour que le texte du menu soit grisé en utilisant le sélecteur créé précédemment
fragment_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/tool_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:popupTheme="@style/AppThemeOverlay.AppBar.Menu" />
</LinearLayout>
Si vous faites ʻapp: popupTheme = "@ style / AppThemeOverlay.AppBar.Menu" dans Toolbar, même si vous avez implémenté Toolbarindépendamment, il sera grisé juste parset Enable`.