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>
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);
}
}
}
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"
/>
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
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>
Merci pour la solution, le seul point à ajouter, c'est que vaut mieux utiliser
NavUtils.navigateUpFromSameTask(SettingsActivity.this);
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">
.....
essayez l'attribut XML android: navigationIcon, ou app:navigationIcon pour les API de plus de 21 ans.