2014-11-14 6 views
8

Ich habe ein Problem, weil ich App für Lutscher ohne support library v7 Entwicklung bin, so muss ich ActionBar Standard verwenden. Zuvor habe ich setHomeButtonEnabled in mehreren Aktivitäten mit actionBar verwendet.Home-Taste in der Aktionsleiste funktioniert nicht in Lollipop

Wenn ich App-Thema zu Material wechselte, funktioniert alles gut, außer setHomeButtonEnabled-Methode.

Der Titel ist nicht anklickbar.

Hilfe!

+0

Verwenden Sie eine Standard ActionBar oder ToolBar als Actionbar? – dhuma1981

+0

Standard ActionBar – TommyNecessary

+1

Welche Funktionalität erwarten Sie von der Home-Taste? Um als Hoch-Taste oder vielleicht eine Schublade zu arbeiten? Veröffentlichen Sie einen Code und das von Ihnen verwendete Thema. – Simas

Antwort

17

Aus irgendeinem Grund entschied jemand bei Google, dass diese zu No-Ops werden sollten. Dies kann unten gesehen werden.

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

Es ist scheinen, als ob ToolbarWidgetWrapper, die verwendet wird, um die Toolbar zu kartieren Unterschiede ActionBar des Nav-Symbol in der Symbolleiste als ‚Heim behandelt Als Aufwärts-Indikator '. Also nur dieser Teil ist anklickbar. Das neue Logo, das Sie in der Toolbar einstellen können, kann niemals anklickbar sein. Sie stellen nicht einmal die Aussicht, ihre privateRolls-Eyes.

So ist die erste Arbeit ist um, wenn Sie die ‚Startseite Wie Up‘ nicht-Funktion verwenden, oder Sie bereit sind, Ihre oben ziehbar mit Ihrem Hause ziehbar zu kombinieren, dann können Sie einfach festlegen das android:homeAsUpIndicator Attribut in Ihrem android:actionBarStyle zusammen mit 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> 

Offensichtlich kann das gleiche mit Code getan werden.

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

Dies bedeutet jedoch, dass es nicht angezeigt wird, während die Aktivität tatsächlich geladen wird. Also am besten mit der Theming Option.

Die dritte Option, die am besten wäre, besteht einfach darin, die Navigationsschaltfläche für die neue Symbolleistenansicht zu gestalten. Welche verwendet android:navigationButtonStyle aber rate mal was .. sie haben das nicht öffentlich gemacht. Ich glaube, das ist ein echter Fehler, aber das alles fängt an, sich wie die ursprünglichen Probleme zu fühlen, die wir alle mit ActionBar hatten.

Lassen Sie uns also arbeiten, die Arbeit herum. Ok, lass uns versuchen, nur android:navigationIcon in android:toolbarStyle zu setzen. Nee. Ok, probieren Sie alle anderen möglichen Variationen aus, die Sie sich vorstellen können, einschließlich android:actionBarStyle und android:actionBarTheme. Nee. Dies ist wahrscheinlich, weil die navigationIcon im Standard-ActionBar/Activity/Toolbar-Chaos an einer Stelle überschrieben wird. Ich kann mich nicht darum kümmern, wo und um mich herumzukommen.

Ok, also endlich wählen wir die flexibelste Option. Löschen Sie die Standard-Home-Schaltfläche, und verwenden Sie unsere eigene, indem Sie die ältere benutzerdefinierte Navigationsfunktion implementieren. Dies bedeutet, wenn Sie bereits ein benutzerdefiniertes Navigationsgerät verwenden, müssen Sie Ihr Navigationsgerät mit diesem kombinieren.

Werte-v21/Stile.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" 
    /> 

In Ihrer Aktivität/BaseActivity Klasse fügen Sie die folgende. Und das wird den Home-Button fälschen.

@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

Vielleicht, wenn sie nur ein paar andere Themes und ein paar weitere Attribute mit einigen Reverse-Double-Rückwärts-Abhängigkeiten-injected-Vererbung-Auflösung-Werten (geräteunabhängig) hinzugefügt haben, die es beheben würden. Stellen Sie sicher, dass es "@ verstecken" ist, obwohl! Ich will die Philister nicht hereinlassen! Sie werden DEFINITIV Dinge durcheinander bringen. – nmr

+1

genau das gleiche Problem mit appcompats 'getSupportActionBar()' - 'com.android.support:appcompat-v7:23.1.1' – kellogs

+0

Das sind die gleichen Probleme, die mich auf iOS verrückt machen. Dieses Verhalten ist auch in Android-Versionen sehr schwer zu testen. Was ist mit der Verwendung von DrawerLayout und ActionBarDrawerToggle mit dieser Methode? Wird es ohne Änderungen funktionieren? –

Verwandte Themen