2013-05-06 5 views
16

So come change the homeAsUpIndicator in the styles xml file. La domanda è come cambiarlo a livello di programmazione.Come cambiare a casa come risorsa up a livello di programmazione?

Il motivo per cui desidero farlo perché in alcune viste supporto la navigazione laterale (menu scorrevole) - premendo il pulsante su/indietro titolo, mostra il menu laterale.

In altre viste, supporto il pulsante naturale su/indietro.

Quindi mi piacerebbe diverse icone di indicatori per indicare le due diverse logiche - navigazione laterale vs su/indietro.

Per favore, non discutiamo sulla motivazione di farlo. Questo è lo stato dato. Grazie.

+0

Sebbene risorse (UPID) viene trovato, e la nuova ImageView definito, al dispositivo Galaxy S3 non incidere opere. Tuttavia, quando ho provato a Nexus 4, funziona bene. – seufagner

risposta

20
int upId = Resources.getSystem().getIdentifier("up", "id", "android"); 
if (upId > 0) { 
    ImageView up = (ImageView) findViewById(upId); 
    up.setImageResource(R.drawable.ic_drawer_indicator); 
} 
+0

Funziona, ma si sente come un hack. È documentato? Il nome 'up' può cambiare in futuro? –

+0

Direi che è un hack. Tuttavia, è l'unico modo per ottenere la vista. Potrebbe essere cambiato in futuro, ma non riesco a immaginare una ragione per cui ciò accada. –

+0

Come detto da Seufagner, ho convalidato che questo ** non ** funziona sul Samasung Galaxy S3. –

15

La soluzione da @matthias non funziona su tutti i dispositivi, una soluzione migliore per cambiare il homeAsUpIndicator è per impostarlo @null nello stile e modificare la risorsa logo di programmazione.

Qui di seguito è il mio codice da style.xml

<style name="Theme.HomeScreen" parent="AppBaseTheme"> 
    <item name="displayOptions">showHome|useLogo</item> 
    <item name="homeAsUpIndicator">@null</item> 
    <item name="android:homeAsUpIndicator">@null</item> 
</style> 

Nel codice è possibile cambiare il logo utilizzando setLogo() metodo.

getSupportActionBar().setLogo(R.drawable.abc_ic_ab_back_holo_light); //for ActionBarCompat 
getActionBar().setLogo(R.drawable.abc_ic_ab_back_holo_light); //for default actionbar for post 3.0 devices 

noti inoltre che la Android API 18 ha metodi per modificare il homeAsUpIndicator programatically, refer documentation.

1

Scrivo soluzione per questo. Non è bello, ma funziona:

public static ImageView getHomeAndUpIndicator(View decorView) { 
    ImageView res = null; 

    int upId = Resources.getSystem().getIdentifier("up", "id", "android"); 
    if (upId > 0) { 
     res = (ImageView) decorView.findViewById(upId); 
    } else { 
     if (android.os.Build.VERSION.SDK_INT <= 10) { 
      ViewGroup acbOverlay = (ViewGroup)((ViewGroup)decorView).getChildAt(0); 
      ViewGroup abcFrame = (ViewGroup)acbOverlay.getChildAt(0); 
      ViewGroup actionBar = (ViewGroup)abcFrame.getChildAt(0); 
      ViewGroup abLL = (ViewGroup)actionBar.getChildAt(0); 
      ViewGroup abLL2 = (ViewGroup)abLL.getChildAt(1); 
      res = (ImageView)abLL2.getChildAt(0); 
     } else if (android.os.Build.VERSION.SDK_INT > 10 && android.os.Build.VERSION.SDK_INT < 16) { 
      ViewGroup acbOverlay = (ViewGroup)((ViewGroup)decorView).getChildAt(0); 
      ViewGroup abcFrame = (ViewGroup)acbOverlay.getChildAt(0); 
      ViewGroup actionBar = (ViewGroup)abcFrame.getChildAt(0); 
      ViewGroup abLL = (ViewGroup)actionBar.getChildAt(1); 
      res = (ImageView)abLL.getChildAt(0); 
     } else { 
      ViewGroup acbOverlay = (ViewGroup)((ViewGroup)decorView).getChildAt(0); 
      ViewGroup abcFrame = (ViewGroup)acbOverlay.getChildAt(1); 
      ViewGroup actionBar = (ViewGroup)abcFrame.getChildAt(0); 
      ViewGroup abLL = (ViewGroup)actionBar.getChildAt(0); 
      ViewGroup abF = (ViewGroup)abLL.getChildAt(0); 
      res = (ImageView)abF.getChildAt(0); 
     } 
    } 
    return res; 
} 

Come una put param:. getWindow() getDecorView()

Prova su alcuni dispositivi (Nexus 7 (4.4.2), samsung galaxy s + (2.3. 6), yaiu g3 (4.2.2)) ed emulatori con Android 2.3.3 e 4.1.1

5

Anche se this answer potrebbe ottenere il comportamento previsto, come si può leggere nei commenti qui sotto: "Questo hack non funziona su alcuni dispositivi ". Ho trovato un altro modo in base a Adneal's answer che mi dà l'indizio e specialmente il modo giusto di fare. API

  • inferiore: l'uso id R.id.up per recuperare il relativo ImageView.

  • API> = 14: ottenere la relativa Parent di casa ImageView (android.R.id.home) e recuperare il primo figlio, che è il UpIndicator (android.R.id.up).

Poi, questo frammento di codice cambia in modo dinamico la UpIndicator:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
    // get the parent view of home (app icon) imageview 
    ViewGroup home = (ViewGroup) findViewById(android.R.id.home).getParent(); 
    // get the first child (up imageview) 
    ((ImageView) home.getChildAt(0)) 
     // change the icon according to your needs 
     .setImageDrawable(getResources().getDrawable(R.drawable.custom_icon_up)); 
} else { 
    // get the up imageview directly with R.id.up 
    ((ImageView) findViewById(R.id.up)) 
     .setImageDrawable(getResources().getDrawable(R.drawable.custom_icon_up)); 
} 

non ho ancora testato su più dispositivi (è per questo che io non sono sicuro che questo codice precedente funziona per tutti i dispositivi), tuttavia questo sembra funzionare bene nelle API menzionate in the update part here.

Nota: se non si fanno la differenza tra API superiori e inferiori, si ottiene un NullPointerException perché R.id.up non è disponibile in API più elevata, mentre android.R.id.up non è disponibile in API inferiore.

4

questo ha lavorato per me

getSupportActionBar().setHomeAsUpIndicator(R.drawable.my_home_as_up) 
0

Ecco codice di lavoro

final Drawable upArrow = getResources().getDrawable(R.drawable.ic_arrow_back_black_24dp); 
     upArrow.setColorFilter(Color.parseColor("#000000"), PorterDuff.Mode.SRC_ATOP); 
     getSupportActionBar().setHomeAsUpIndicator(upArrow); 
Problemi correlati