it-swarm.com.de

Ist es möglich, ein Menüelement in Android auszublenden (nicht nur zu deaktivieren)?

Es gibt eine Frage zur gleichen Funktionalität zu Blackberry , und ein paar verschiedene Threads beziehen sich auf diesen Bug (der seither ohne Auflösung geschlossen wurde, soweit ich das beurteilen kann), aber ich habe keine gefunden speziell für Android.

Ich rufe setEnabled(false) für bestimmte MenuItems auf, die auf einem bestimmten Status basieren, aber sie sehen optisch gleich aus. Ich möchte, dass sie auf irgendeine Weise versetzt werden, sodass der Benutzer weiß, dass die Option derzeit nicht verfügbar ist. Gibt es eine Möglichkeit, dies zu tun?

36
Waynn Lue

Ich hatte das gleiche Problem. Es gibt zwei Möglichkeiten, dies zu erreichen:

  1. Fügen Sie Ihre Symbole in eine StateList ein, sodass beim Deaktivieren ein anderes Symbol verwendet wird
  2. Was ich jetzt benutze Ändern Sie das Symbol selbst mit etwas in onPrepareOptionsMenu():

    public boolean onPrepareOptionsMenu(Menu menu) {
        boolean menusEnabled = reachedEndOfSlidehow(); // enable or disable?
        MenuItem item = menu.findItem(R.id.menu_next_slide);
        Drawable resIcon = getResources().getDrawable(R.drawable.ic_next_slide);
    
        if (!menusEnabled)
            resIcon.mutate().setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_IN);
    
        item.setEnabled(menusEnabled); // any text will be automatically disabled
        item.setIcon(resIcon);
    }
    

Sie können invalidateOptionsMenu() (oder von ABS, supportInvalidateOptionsMenu()) aus aufrufen, um das Menü neu aufzubauen.

EDIT: Lösung 2 wurde aktualisiert

Quelle: https://groups.google.com/forum/?fromgroups#!topic/actionbarsherlock/Z8Ic8djq-3o

54
Oleg Vaskevich

Bei allen Android-Versionen ist dies der einfachste Weg, um ein Menüaktionssymbol als deaktiviert anzuzeigen, und FUNKTION als deaktiviert zu setzen:

@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);
    }
}
57
Frank

Ich habe einen neuen Weg gefunden, um dieses Problem mithilfe einer XML-Datei für die Zeichnungsauswahl zu lösen. Sie erstellen einfach einen Selektor mit dem Symbol, das Sie in Ihrem Menüelement verwenden möchten. Dann können Sie entweder den Farbton, das Alpha oder beides der Bitmap ändern:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item Android:state_enabled="true">
        <bitmap Android:src="@drawable/ic_menu_item"
            Android:tint="@color/enabled_color"
            Android:alpha="@integer/enabled_alpha"/>
    </item>

    <item Android:state_enabled="false">
        <bitmap Android:src="@drawable/ic_menu_item"
            Android:tint="@color/disabled_color"
            Android:alpha="@integer/disabled_alpha"/>
    </item>
</selector>

Als Anmerkung; Ich möchte den Farbton auf "?android:attr/textColorPrimary" für den aktivierten Status und "?android:attr/textColorHint" für den deaktivierten Status setzen. Auf diese Weise wird es je nach verwendetem Thema angepasst.


Dann können Sie einfach das Symbol in Ihrer Menü-XML-Datei auf die Auswahlressource setzen:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">

    <item Android:id="@+id/menu_action"
        Android:orderInCategory="0"
        Android:title="@string/title_menu_action"
        Android:icon="@drawable/ic_menu_item_selector"
        app:showAsAction="ifRoom"/>

</menu>

Wenn Sie dann item.setEnabled(enabled) aufrufen, ändert sich die Farbe und/oder das Alpha des Symbols zusammen mit dem Status!

7
Bryan

setEnabled(false) funktioniert gut bei API Level < 14, aber bei 14 ist das Element immer noch anklickbar.

2
Hoochwo

Wie ich es gemacht habe, ist die Verwendung von "itemIconTint" in der Navigationsansicht. Sie können den Text auch mit "itemTextColor" grau unterlegen.

Dies ist die Navigationsansicht:

<Android.support.design.widget.NavigationView
    Android:id="@+id/nav_view"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    app:itemBackground="@color/white"
    Android:background="@color/white"
    app:itemTextColor="@color/menu_text_color"
    app:itemIconTint="@color/menu_text_color"
    app:menu="@menu/main_drawer" />

und "@ color/menu_text_color" ist ein Selektor:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true" Android:color="@color/primaryColor" />
    <item Android:state_enabled="false" Android:color="@color/disabled_text_color" />
    <item Android:color="@color/primaryText" />
</selector>

Schließlich, wenn Sie ein Menuitem deaktivieren möchten, 

MenuItem item = mNavigationView.getMenu().findItem(R.id.your_menu_item);
item.setEnabled(isEnable);

Erledigt!

1
SoYoung

Hier ist eine einfache Möglichkeit (mit Kotlin):

fun changeMenuItemColour(enabled: Boolean) {
    var menuItem = SpannableString(mCustomToolbar?.menu?.findItem(R.id.some_menu_item)?.title)
    var style = activity?.resources?.getColor(R.color.darkGraphite)!!
    if (enabled) style = activity?.resources?.getColor(R.color.black)!!
    menuItem.setSpan(ForegroundColorSpan(style), 0, menuItem.length, 0)
}
1
Andrew Odendaal

Schauen Sie sich diesen link an 

setEnabled kann auch für MenuItems verwendet werden.

1
Pavandroid

Ich hatte Probleme mit diesem Thema auf modernen Android mit MaterialComponents Theme. Mein Problem war, ich hatte <item name="actionMenuTextColor">@color/blue</item> In styles.xml Gesetzt und dies überschreibt die Textfarbe, ob das Element aktiviert oder deaktiviert Die Lösung besteht darin, ein Farbstatusliste und keine Farbe direkt festzulegen.

Das Attribut "Meine Stile" sieht jetzt folgendermaßen aus:

<item name="actionMenuTextColor">@drawable/menu_color_selector</item>

0