[JAVA] [Android] Élément de menu grisé dans le menu Options

Aperçu

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

Mise en œuvre du menu d'options

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

Options de mise à jourMenu menu avec onPrepareOptionsMenu

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`

Si vous utilisez la barre d'outils

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`.

référence

Menu grisé sur le journal d'Android-Tadao Yamaoka

Recommended Posts

[Android] Élément de menu grisé dans le menu Options
Remarques sur le studio Android