Hier möchte ich beschreiben, wie ich eine fehlende Toolbar zu einer Settings Activity hinzugefügt habe
Erster Versuch: Einen neuen style hinzufügen
Meine App hatte Navigation Drawer Activities verwendet, die eine eigene Toolbar in der layout.xml definiert habe. Die Settings Activity hat keine solche Datei. Ein Blick in die res/values/styles.xml Datei zeigte, dass der genutzte Style so was wie “Theme.AppCompat.Light.NoActionBar” als Parent besitzt. Deshalb fügen wir für die Settings einen neuen Style in die styles.xml hinzu, der ein Parent mit einer Actionbar hat:
<style name="AppThemeWithActionBar" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style>
Dann ersetze das genutzte Theme oder fügt ein neues Theme in die Android Manifest Datei für die Settings Activity hinzu: (Ersetze den Namen und das Label mit deine genutzten Namen)
<activity android:theme="@style/AppThemeWithActionBar" android:name="SettingsActivity" android:label="@string/Settings"> </activity>
Das sollte funktionieren und ist recht einfach. Aber ich möchte vielleicht die Farbe der Tolobar oder des Hintergrundes ändern, dafür gibt es einen anderen Weg:
Zweiter Versuch: Füge eine eigene layout.xml hinzu
Ich habe meine eigene layout.xml für die Settings hinzugefügt um Farben und so anpassen zu können:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.yourname.app"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:id="@+id/appBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay"/> </android.support.design.widget.AppBarLayout> <!-- Settings are shown in the following listView, so don't change the id --> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@android:id/list" android:layout_alignParentLeft="true" android:layout_below="@+id/appBar" android:layout_alignParentBottom="true" /> </RelativeLayout>
Danach muss man nur diese Layout Datei in der onCreate() Methode der Settings Activity hinzufügen, sodass man auf die Toolbar und so zugreifen kann:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.settings); //add your settings layout Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); //get the toolbar setSupportActionBar(toolbar); //important to show the activity name in the toolbar ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { //set a nice back arrow in the action bar (handle the click in onOptionsItemSelected()) actionBar.setDisplayHomeAsUpEnabled(true); } //other stuff from your onCreate method.... }
Dank der RelativeLayout in der Layout Datei überlappt die Toolbar nicht die Liste der Einstellungen. Aber auf Pre-Lolipop Android Geräten hat die Toolbar keinen Schatten. Ein Weg das zu beseitigen ist es ein Custom View mit einen Schatten als Hintergrund hinzuzufügen, so wie hier beschrieben: http://blog.grafixartist.com/add-a-toolbar-elevation-on-pre-lollipop/
Ich fügte daher wie dort beschrieben die Schatten Drawable Datei hinzu und füge folgendes unter dem ListView Block der Settings Layout Datei hinzu:
<!-- Shows a little shadow under the toolbar --> <View android:layout_width="match_parent" android:layout_height="4dp" android:background="@drawable/shadow" android:layout_below="@+id/appBar" android:layout_alignParentLeft="true" />
Wie im verlinkten Beitrag beschrieben ist es nicht die Arbeit wert, diesen Schatten auf Post-Lolipop Android Geräten zu verstecken, also nutzt es dort einfach auch.