web-dev-qa-db-fra.com

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

J'essaie de convertir mon application pour qu'elle utilise la bibliothèque AppCompat v21. J'ai donc commencé à utiliser Toolbar au lieu d'ActionBar. Dans toutes mes activités régulières (qui prolongent ActionBarActivity), tout va bien. mais dans mon SettingsActivity qui étend PreferenceActivity, et par conséquent je ne peux pas utiliser l'appel setSupportActionBar (actionbar), je dois utiliser une barre d'outils "autonome". La barre d’outils apparaît, mais je ne vois pas comment ajouter le bouton "accueil/up" à la barre d’outils.

ParamètresActivité.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>

J'ai essayé d'ajouter actionBarStyle et displayOptions à mon thème, comme expliqué dans la section Bouton Afficher vers le haut/précédent sur Android imbriqué PreferenceScreen? , mais dans d'autres endroits, les utilisateurs disaient qu'actionBarStyle avait gagné " ne pas être utilisé lorsque j'utilise la barre d'outils, et ils semblent avoir raison.

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

La solution de Pedro Oliveira a fonctionné. Je pourrais même trouver le dessin que la bibliothèque AppCompat utilise (et est donc déjà inclus dans l'apk). Quoi de plus il est également reflété, de sorte qu'il fonctionne à la fois pour les locales ltr, rtl:

actionbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

et c'est tout à fait cela, 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);
        }
    }
}
58
Gavriel

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"
        />
28
ls.illarionov

trop tard pour la fête ici, mais je vais quand même fournir mon 0,02 $. Je l’ai fait de la manière suivante pour montrer la flèche vers le haut dans fragment en utilisant AppCompactActivity

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

et gérer l'événement onClick dans votre activité onOptionsItemSelected

11
war_Hero

Si vous indiquez le nom de l'activité principale dans Manifest.xml Et des méta-données à prendre en charge Android 4.0 et versions antérieures, vous pouvez simplement définir l'icône de navigation (toolbar.setNavigationIcon(R.drawable.ic_action_back);)). marchera.

Exemple Manifest.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
Tomasz Mularczyk

Merci pour la solution, le seul point à ajouter est qu'il vaut mieux utiliser

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

Définissez un 9patch d’arrière-plan pour votre barre d’outils;) ça marche. 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
Stéphane

Essayez l'attribut XML Android: navigationIcon ou app: navigationIcon pour les API de plus de 21 ans.

0
Xingang Huang