2014-11-14 21 views
8

Ho un problema, perché sto sviluppando app per lecca-lecca senza support library v7, quindi ho bisogno di usare lo standard ActionBar. In precedenza ho utilizzato setHomeButtonEnabled in più attività con actionBar.Pulsante Home nella barra delle azioni non funziona in Lollipop

Quando ho passato il tema dell'app al materiale, tutto funziona correttamente, tranne il metodo setHomeButtonEnabled.

Il titolo non è selezionabile.

Help!

+0

Si sta utilizzando ActionBar standard o Barra degli strumenti come barra delle azioni? – dhuma1981

+0

Standard ActionBar – TommyNecessary

+1

Che funzionalità ti aspetti dal pulsante Home? Per funzionare come pulsante su o forse un interruttore a cassetto? Pubblica un po 'di codice e il tema che stai utilizzando. – Simas

risposta

17

Per qualche motivo, qualcuno in Google ha deciso che questi dovevano diventare no-op. Questo può essere visto sotto.

ToolbarWidgetWrapper.java

@Override 
public void setHomeButtonEnabled(boolean enable) { 
    // Ignore 
} 

ToolbarActionBar.java

@Override 
public void setHomeButtonEnabled(boolean enabled) { 
    // If the nav button on a Toolbar is present, it's enabled. No-op. 
} 

E sembra come se ToolbarWidgetWrapper che viene utilizzato per mappare la barra degli strumenti per ActionBar differenze tratta l'icona Nav nella barra degli strumenti come la 'casa Come indicatore alto '. Quindi solo quella parte è cliccabile. Il nuovo logo che puoi impostare su Toolbar non può mai essere cliccabile. Non hanno nemmeno esposto la vista, è privaterotoli-occhi.

Così il primo lavoro intorno è se non si utilizza il 'casa Come Up' funzione o si è disposti a combinare il tuo up drawable con la vostra casa drawable allora si potrebbe semplicemente impostare l'attributo android:homeAsUpIndicator nel vostro android:actionBarStyle con android:displayOptions="homeAsUp" .

<style name="AppBaseTheme" parent="@android:style/Theme.Material.Light.DarkActionBar"> 
    <item name="android:actionBarStyle">@style/ActionBar</item> 
</style> 

<style name="ActionBar" parent="@android:style/Widget.Material.Light.ActionBar.Solid"> 
    <item name="android:background">@color/action_bar_bg</item> 
    <item name="android:displayOptions">homeAsUp</item> 
    <item name="android:homeAsUpIndicator">@drawable/app_logo</item> 
</style> 

Ovviamente questa stessa cosa può essere eseguita con il codice.

getActionBar().setHomeAsUpIndicator(R.drawable.app_logo); 
getActionBar().setDisplayHomeAsUpEnabled(true); 

Ma questo significa che non verrà visualizzato mentre l'attività viene effettivamente caricata. Quindi meglio andare con l'opzione tematica.

La terza opzione che sarebbe meglio è solo per lo stile del pulsante di navigazione per la nuova vista Toolbar. Che usa android:navigationButtonStyle ma indovina cosa ... non hanno reso pubblico quello. Credo che questo sia un errore geninue, ma tutto questo inizia a somigliare ai problemi originali che tutti abbiamo avuto con ActionBar in primo luogo.

Quindi, è possibile aggirare il problema. Ok proviamo a impostare lo android:navigationIcon nello android:toolbarStyle. No. Ok, proviamo tutte le altre possibili variazioni che puoi immaginare includendo android:actionBarStyle e android:actionBarTheme. No. Ciò che mi aspetto è che il navigationIcon sia sovrascritto in un punto del pasticcio ActionBar/Activity/Toolbar predefinito. Non riesco a disturbarmi per individuare dove e aggirare il problema.

Ok, quindi finalmente scegliamo l'opzione più flessibile. Rilascia il pulsante Home predefinito e usa il nostro implementando la funzionalità di navigazione personalizzata precedente. Questo significa che se usi già un nav personalizzato dovrai combinare il tuo nav con questo.

valori-v21/stili.xml

<style name="AppBaseTheme" parent="@android:style/Theme.Material.Light.DarkActionBar"> 
    <item name="android:actionBarStyle">@style/ActionBar</item> 
</style> 

<style name="ActionBar" parent="@android:style/Widget.Material.Light.ActionBar.Solid"> 
    <item name="android:background">@color/action_bar_bg</item> 
    <item name="android:displayOptions">showCustom</item> 
    <item name="android:customNavigationLayout">@layout/nav_layout</item> 
</style> 

Layout-V21/nav_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/home" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="start|center_vertical" 
    android:layout_marginEnd="8dp" 
    android:paddingTop="16dp" 
    android:paddingBottom="16dp" 
    android:adjustViewBounds="true" 
    android:background="?android:attr/actionBarItemBackground" 
    android:contentDescription="@string/ab_home_description" 
    android:src="@drawable/app_logo" 
    android:scaleType="fitCenter" 
    /> 

Nella classe di attività/BaseActivity aggiungere la seguente. E questo falsificherà il pulsante home.

@Override 
public boolean onPrepareOptionsMenu(final Menu menu) 
{ 
    prepareOptionsMenuLollipop(menu); 
    return super.onPrepareOptionsMenu(menu); 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private void prepareOptionsMenuLollipop(Menu menu) 
{ 
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ 
     final MenuItem homeItem = menu.add(Menu.NONE, android.R.id.home, 
      Menu.NONE, R.string.ab_home_description); 
     homeItem.setVisible(false); 
     View homeView = getActionBar().getCustomView().findViewById(android.R.id.home); 
     homeView.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) 
      { 
       getWindow().getCallback().onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, homeItem); 
      } 
     }); 
    } 
} 
+1

Forse se aggiungessero solo un paio di temi e alcuni altri attributi con alcuni valori di risoluzione di ereditarietà inversa a doppia inversione di marcia (indipendenti dalla periferica) che lo risolverebbero. Assicurati però che sia '@ hide'! Non voglio lasciare entrare i filistei! Sicuramente confonderanno le cose. – nmr

+1

esattamente lo stesso problema con 'getSupportActionBar()' di appcompat - 'com.android.support:appcompat-v7:23.1.1' – kellogs

+0

Questi sono gli stessi problemi che mi fanno impazzire su iOS. Questo comportamento è molto difficile da testare anche su versioni Android. Che ne dici di usare DrawerLayout e ActionBarDrawerToggle con questo metodo? Funzionerà senza modifiche? –

Problemi correlati