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 par
set Enable`.