Comment activer homeAsUp ou call setDisplayHomeAsUpEnabled () sur la barre d'outils autonome avec appcompat v21

j'essaie de convertir mon application pour utiliser la bibliothèque V21 AppCompat, donc j'ai commencé à utiliser Toolbar au lieu D'ActionBar. Dans toutes mes activités régulières (qui étendent L'Activitéd'action) tout va bien. mais dans mon Activitédes règlements qui étend L'Activitédepréférence, et donc je ne peux pas utiliser l'appel setSupportActionBar(actionbar) j'ai besoin d'utiliser une barre d'outils "standalone". La barre d'outils apparaît, mais je n'arrive pas à comprendre comment j'ai pu ajouter le bouton "home / up" à la barre d'outils.

activité de règlement.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);
        }
    }
}

mise en page/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>

mise en page/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/Paramètres.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>

j'ai essayé d'ajouter actionBarStyle et displayOptions à mon thème comme expliqué dans Show up/back button sur android nested PreferenceScreen? , mais dans d'autres endroits les gens ont dit que actionBarStyle ne sera pas utilisé lorsque j'utilise barre D'outils, et ils semblent être à droite.

valeurs/thèmes.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>
47
demandé sur Community 2014-11-04 13:34:16

7 réponses

la solution de @Pedro Oliveira a fonctionné. Je pourrais même trouver le drawable que la bibliothèque AppCompat utilise (et est donc déjà inclus dans l'apk). De plus, il est également miroir, donc il fonctionne à la fois pour ltr, rtl locales:

actionbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

et c'est tout ensemble, avec la correction de @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);
        }
    }
}
56
répondu Gavriel 2014-12-14 21:07:50

vous pouvez utiliser ?homeAsUpIndicator au lieu de 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"
        />
25
répondu ls.illarionov 2015-12-07 05:45:50

trop tard pour la fête ici, mais je fournirai quand même mes 0,02$. Je l'ai fait de la façon suivante pour montrer la flèche haut dans fragment en utilisant AppCompactActivity

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

et gérer l'événement onClick à l'intérieur de votre activité onOptionsItemSelected

10
répondu war_Hero 2016-03-26 18:22:22

si vous fournissez le nom de l'activité parent dans Manifest.xml et des métadonnées pour prendre en charge Android 4.0 et inférieur, alors vous pouvez juste définir l'icône de navigation ( toolbar.setNavigationIcon(R.drawable.ic_action_back); ) et il va fonctionner.

manifeste.exemple xml:

    <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
répondu Tomasz Mularczyk 2015-06-22 14:42:00

Merci pour la solution, le seul point à ajouter, c'est que vaut mieux utiliser

NavUtils.navigateUpFromSameTask(SettingsActivity.this); 
2
répondu Viktor Yakunin 2014-12-12 19:41:49

définissez un background 9patch pour votre barre d'outils ;) c'est du travail. Voici 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
répondu Stéphane 2015-10-23 05:44:29

essayez l'attribut XML android: navigationIcon, ou app:navigationIcon pour les API de plus de 21 ans.

0
répondu Xingang Huang 2015-09-16 16:29:29