wake-up-neo.com

So aktivieren Sie homeAsUp oder rufen setDisplayHomeAsUpEnabled () in der eigenständigen Symbolleiste mit appcompat v21 auf

Ich versuche, meine App für die Verwendung der AppCompat-Bibliothek von v21 zu konvertieren. Daher habe ich begonnen, die Symbolleiste anstelle von ActionBar zu verwenden. Bei all meinen regelmäßigen Aktivitäten (die ActionBarActivity erweitern) ist alles in Ordnung. Aber in meinem SettingsActivity, das PreferenceActivity erweitert, und daher den Aufruf setSupportActionBar (actionbar) nicht verwenden kann, muss ich eine "eigenständige" Symbolleiste verwenden. Die Symbolleiste wird angezeigt, aber ich kann nicht herausfinden, wie ich der Symbolleiste die Schaltfläche "home/up" hinzufügen kann.

SettingsActivity.Java:

public class SettingsActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        Toolbar actionbar = (Toolbar) findViewById(R.id.actionbar);
        if (null != actionbar) {

            // In every other activity that extends ActionBarActivity I simply use:
            // setSupportActionBar(actionbar);
            // final ActionBar supportActionBar = getSupportActionBar();
            // supportActionBar.setDisplayHomeAsUpEnabled(true);

            // but in PreferenceActivity you need to add a standalone toolbar:    
            actionbar.setTitle(R.string.title_activity_settings);
            actionbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    SettingsActivity.this.finish();
                }
            });

            // Inflate a menu to be displayed in the toolbar
            actionbar.inflateMenu(R.menu.settings);
        }
    }
}

layout/activity_settings.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              xmlns:tools="http://schemas.Android.com/tools"
              tools:context=".SettingsActivity"
              tools:menu="settings"
              tools:actionBarNavMode="standard"
              Android:layout_width="match_parent"
              Android:layout_height="match_parent"
              Android:orientation="vertical">

    <include
        layout="@layout/actionbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"/>

    <ListView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:id="@Android:id/list" />
</LinearLayout>

layout/actionbar.xml:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/actionbar"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    Android:minHeight="?attr/actionBarSize"
    Android:background="?attr/colorPrimaryDark"
    app:theme="@style/AppTheme"
    />

menu/settings.xml:

<menu 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"
    tools:context="com.fletech.Android.redalert.SettingsActivity" >
</menu>

Ich habe versucht, meinem Thema actionBarStyle und displayOptions hinzuzufügen, wie in Schaltfläche zum Anzeigen/Zurück auf Android verschachtelter PreferenceScreen? ) erläutert. Wird nicht verwendet, wenn ich die Symbolleiste verwende, und sie scheinen richtig zu sein.

values ​​/ themes.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base"/>

    <style name="AppTheme.Base" parent="Theme.AppCompat">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimary</item>
        <item name="Android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="windowActionModeOverlay">true</item>

        <!-- Set AppCompat’s actionBarStyle -->
        <item name="actionBarStyle">@style/MyActionBar</item>
    </style>

    <style name="MyActionBar" parent="Widget.AppCompat.ActionBar">
        <item name="displayOptions">showHome|homeAsUp|showTitle</item>
    </style>
<resources>
48
Gavriel

@Pedro Oliveiras Lösung hat funktioniert. Ich konnte sogar das Drawable finden, das die AppCompat-Bibliothek verwendet (und daher bereits in der apk enthalten ist). Was mehr ist es auch gespiegelt, so dass es sowohl für ltr, rtl-Gebietsschemata funktioniert:

actionbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

und das ist alles zusammen, mit der Korrektur von @ VictorYakunin

public class SettingsActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        Toolbar actionbar = (Toolbar) findViewById(R.id.actionbar);
        if (null != actionbar) {
            actionbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

            actionbar.setTitle(R.string.title_activity_settings);
            actionbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    NavUtils.navigateUpFromSameTask(SettingsActivity.this);
                }
            });

            // Inflate a menu to be displayed in the toolbar
            actionbar.inflateMenu(R.menu.settings);
        }
    }
}
58
Gavriel

Sie können ?homeAsUpIndicator anstatt R.drawable.abc_ic_ab_back_mtrl_am_alpha:

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="?colorPrimary"
        Android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:navigationIcon="?homeAsUpIndicator"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:title="@string/title"
        />
28
ls.illarionov

viel zu spät zur Party hier, aber ich werde trotzdem meine 0,02 $ zur Verfügung stellen. Ich habe es folgendermaßen gemacht, um die Markierung mit dem Aufwärtspfeil in fragment mit AppCompactActivity anzuzeigen.

((MainActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

und behandeln Sie das onClick-Ereignis in Ihrer Aktivität onOptionsItemSelected

11
war_Hero

Wenn Sie den Namen der übergeordneten Aktivität in Manifest.xml Und Metadaten für die Unterstützung von Android 4.0 und niedriger) angeben, können Sie einfach das Navigationssymbol (toolbar.setNavigationIcon(R.drawable.ic_action_back);) und dieses festlegen wird funktionieren.

Manifest.xml-Beispiel:

    <activity
        Android:name=".MainActivity"
        Android:label="@string/app_name" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:name=".ProductActivity"
        Android:label="@string/title_activity_product"
        Android:parentActivityName=".MainActivity">
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value=".MainActivity" />
    </activity>
6

Vielen Dank für die Lösung. Der einzige Punkt, den Sie hinzufügen müssen, ist die bessere Verwendung

NavUtils.navigateUpFromSameTask(SettingsActivity.this); 
2
Viktor Yakunin

Definieren Sie ein Hintergrundpatch für Ihre Symbolleiste;) es funktioniert. Hier ist toolbar_background.9.png

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@drawable/toolbar_background">

    .....
2
Stéphane

Probieren Sie das XML-Attribut Android: navigationIcon oder app: navigationIcon für API älter als 21 aus.

0
Xingang Huang