5

Nella mia app ho impostato la casa come indicatore di un disegno non predefinito in alcune circostanze. A volte la home come indicatore up dovrebbe essere ripristinata all'icona predefinita dopo che è stata cambiata.Come mostrare la casa predefinita come indicatore in alto usando la barra delle azioni di supporto?

Ho provato con

getSupportActionBar().setHomeAsUpIndicator(0); 

Che secondo documentation dice utilizzerà il predefinito tema. Quando faccio questo, l'applicazione si blocca con il seguente errore:

05-15 11:12:03.160: E/AndroidRuntime(13021): FATAL EXCEPTION: main 
05-15 11:12:03.160: E/AndroidRuntime(13021): Process: xxxxx.yyyyyy.zzzzzz, PID: 13021 
05-15 11:12:03.160: E/AndroidRuntime(13021): android.content.res.Resources$NotFoundException: Resource ID #0x0 
05-15 11:12:03.160: E/AndroidRuntime(13021): at android.content.res.Resources.getValue(Resources.java:1233) 
05-15 11:12:03.160: E/AndroidRuntime(13021): at android.content.res.Resources.getDrawable(Resources.java:756) 
05-15 11:12:03.160: E/AndroidRuntime(13021): at android.content.Context.getDrawable(Context.java:402) 
05-15 11:12:03.160: E/AndroidRuntime(13021): at android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21.java:26) 
05-15 11:12:03.160: E/AndroidRuntime(13021): at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:319) 
05-15 11:12:03.160: E/AndroidRuntime(13021): at android.support.v7.internal.widget.TintManager.getDrawable(TintManager.java:133) 
05-15 11:12:03.160: E/AndroidRuntime(13021): at android.support.v7.widget.Toolbar.setNavigationIcon(Toolbar.java:754) 
05-15 11:12:03.160: E/AndroidRuntime(13021): at android.support.v7.internal.app.ToolbarActionBar.setHomeAsUpIndicator(ToolbarActionBar.java:176) 
05-15 11:12:03.160: E/AndroidRuntime(13021): at xxxxx.yyyyyy.zzzzzz.updateHomeIndicator(aaaaa.java:1711) 

Conosco il valore tema di default è impostato correttamente, perché se non l'ho mai messo in casa come indicatore di una consuetudine, la freccia indietro appare bene. Sto chiamando setDisplayHomeAsUpEnabled(true) prima di provare la chiamata setHomeAsUpIndicator(0).

So che posso sempre copiare la casa predefinita come risorsa indicatore in alto nel mio progetto e utilizzare quella risorsa direttamente, ma vorrei evitare questa soluzione alternativa se possibile.

Grazie!

Zach

Edit:

Ho anche provato

getSupportActionBar().setHomeAsUpIndicator(null); 

che si traduce in nessuna icona viene visualizzata sorta.

+0

Perché stai passando 0 anziché un valore booleano? –

+0

L'API setHomeAsUpIndicator() richiede un valore ID drawable o int resource. Non ci sono API booleane paramater che realizzano questo (per quanto ne so). – Zach

+2

@CarlosJ leggi più vicino, dovrebbe funzionare. La documentazione afferma: 'Se si passa 0 a questo metodo, verrà utilizzato il drawable predefinito dal tema. Questo è perfettamente valido secondo la documentazione, tuttavia, sembra che se si imposta un'icona personalizzata, non è possibile chiamare con zero in seguito per reimpostarlo all'icona predefinita. Questo deve essere un caso angolo con l'API. –

risposta

0

seguo il codice sorgente di: ToolbarActionBar.setHomeAsUpIndicator()

E quando vedo il codice sorgente di: ContextCompat.getDrawable(), si dice: "Il valore 0 è un identificatore valido".

/** 
* Return a drawable object associated with a particular resource ID. 
* <p> 
* Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the returned 
* drawable will be styled for the specified Context's theme. 
* 
* @param id The desired resource identifier, as generated by the aapt tool. 
*   This integer encodes the package, type, and resource entry. 
*   The value 0 is an invalid identifier. 
* @return Drawable An object that can be used to draw this resource. 
*/ 
public static final Drawable getDrawable(Context context, int id) { 
    final int version = Build.VERSION.SDK_INT; 
    if (version >= 21) { 
     return ContextCompatApi21.getDrawable(context, id); 
    } else { 
     return context.getResources().getDrawable(id); 
    } 
} 

E continuo a seguire il codice sorgente, e vedo sotto il codice, infine, questo è dove si fa eccezione tiro: Resources.getValue()

/** 
* Return the raw data associated with a particular resource ID. 
* 
* @param id The desired resource identifier, as generated by the aapt 
*   tool. This integer encodes the package, type, and resource 
*   entry. The value 0 is an invalid identifier. 
* @param outValue Object in which to place the resource data. 
* @param resolveRefs If true, a resource that is a reference to another 
*     resource will be followed so that you receive the 
*     actual final resource data. If false, the TypedValue 
*     will be filled in with the reference itself. 
* 
* @throws NotFoundException Throws NotFoundException if the given ID does not exist. 
* 
*/ 
public void getValue(int id, TypedValue outValue, boolean resolveRefs) 
     throws NotFoundException { 
    boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs); 
    if (found) { 
     return; 
    } 
    throw new NotFoundException("Resource ID #0x" 
           + Integer.toHexString(id)); 
} 

Fino ad ora, non riesco a vedere alcun trattamento speciale per lo "0". Quindi, penso che sia un bug nel documento ufficiale che pubblichi sopra. Il modo più semplice per risolvere questo errore è utilizzare un identificatore esistente, proprio come il tuo ID icona predefinito.

Problemi correlati