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