2012-03-10 8 views
35

C'è una domanda per la stessa funzionalità on Blackberry, e alcuni thread diversi riferiti a questo bug (che da allora è stato chiuso senza risoluzione per quanto posso dire), ma non ne ho trovato uno specifico per Android.E 'possibile oscurare (non solo disabilitare) un MenuItem in Android?

Sto chiamando setEnabled(false) su determinati MenuItem in base a qualche stato, ma hanno lo stesso aspetto visivo. Mi piacerebbe che fossero compensati in qualche modo, in modo che l'utente sappia che l'opzione al momento non è disponibile - esiste un modo per farlo?

risposta

49

Ho avuto lo stesso problema. Ci sono due modi di ottenere questo al lavoro:

  1. Metti la tua icone in una StateList modo che un'icona diversa sarà utilizzato su disabilita
  2. Quello che uso ora. Cambiare l'icona con qualcosa di simile 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); 
    } 
    

È possibile chiamare invalidateOptionsMenu() (o da ABS, supportInvalidateOptionsMenu()) per ricostruire il menu.

EDIT: soluzione Aggiornato 2

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

+0

Accettato ed eliminato la mia risposta. –

+1

In realtà questo cambia il colore della voce/del titolo del menu? Cioè, non lo esclude? Da quello che ho capito, ciò influenzerà solo l'icona. Cosa succede se non hai un'icona e hai solo testo? –

+2

La chiamata a item.setEnabled() renderà già il testo ombreggiato. Il problema è che su Action Bars il testo è disattivato, ma l'icona no - questo codice lo mette in evidenza. –

1

Date un'occhiata a questo link

setEnabled può essere utilizzato anche per MenuItems.

+1

Sì, sto usando setEnabled, ma non cambia visivamente. –

+0

prova il codice sottostante booleano pubblico suCreateOptionsMenu (Menu menu) { \t \t menu.add (0, 1, 1, "Test"). SetEnabled (false); \t \t return super.onCreateOptionsMenu (menu); \t} – Pavandroid

+0

Questo sta funzionando bene per me. – Pavandroid

2

setEnabled(false) funziona bene su API Level < 14 ma 14 voce ancora cliccabile.

54

Su tutte le versioni di Android, modo più semplice per utilizzare questo per mostrare un icona di azione menu come disabili e affinché funzioni come disabili, nonché:

@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); 
    } 
} 
+0

Questo è esattamente quello che stavo cercando. – ElliotM

+0

Sì, questo è stato il trucco per me, bello poter mantenere l'icona originale. –

+10

Nota: se questa icona viene usata elsewere, assicurati di mutare() prima di impostare alpha, altrimenti tutte le posizioni che usano questo drawable saranno aggiustate che non è necessariamente ciò che si potrebbe desiderare. – dimsuz

5

ho trovato un nuovo modo per risolvere questo problema utilizzando un drawable selettore xml file. Basta creare un selettore con l'icona che si desidera utilizzare nella vostra voce di menu, è possibile cambiare sia la tinta, alfa o entrambe le bitmap:

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

Come nota a margine; Mi piace impostare la tinta su "?android:attr/textColorPrimary" per lo stato abilitato e "?android:attr/textColorHint" per lo stato disabilitato. In questo modo si regolerà a seconda del tema utilizzato.


Poi si può solo impostare l'icona nel file XML menu per la risorsa di selezione:

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

Poi quando si chiama item.setEnabled(enabled) il colore e/o alfa dell'icona cambierà con il stato!

+0

Questa soluzione è valida solo per Android 5.0+ (API 21+) Lollipop e oltre, quindi setColorFilter è necessario nelle versioni precedenti. – straya

0

Il modo in cui l'ho fatto è quello di utilizzare "itemIconTint" in NavigationView, si può anche grigio fuori il testo utilizzando "itemTextColor"

Questo è Navigationview:

<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" /> 

e il "@color/menu_text_color" è un selettore:

<?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> 

Infine, se si desidera disabilitare un menuitem,

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

Fatto!

0

Ecco un modo semplice per farlo (usando 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) 
} 
Problemi correlati