[Android] Füge eine Toolbar zu einer Settings Activity hinzu

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.