Je migre de ActionBar
vers Toolbar
dans mon application. Mais je ne sais pas comment afficher et définir un événement clic sur la flèche arrière sur Toolbar
comme je l’ai fait sur Actionbar
.
Avec ActionBar
, j'appelle mActionbar.setDisplayHomeAsUpEnabled(true)
. Mais il n'y a pas de méthode similaire comme celle-ci.
Quelqu'un a-t-il déjà fait face à cette situation et a-t-il trouvé un moyen de la résoudre?
Si vous utilisez un ActionBarActivity
, vous pouvez dire à Android d’utiliser Toolbar
comme ActionBar
comme suit:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
Et puis appelle à
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
marchera. Vous pouvez également l'utiliser dans les fragments attachés à ActionBarActivities
, vous pouvez l'utiliser comme ceci:
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);
Si vous n'utilisez pas ActionBarActivities
ou si vous souhaitez obtenir la flèche de retour sur un Toolbar
qui n'est pas défini comme votre SupportActionBar
, vous pouvez utiliser les éléments suivants:
mActionBar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
mActionBar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//What to do on back clicked
}
});
Si vous utilisez Android.support.v7.widget.Toolbar
, vous devez ajouter le code suivant à votre AppCompatActivity
:
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
Je vois beaucoup de réponses mais voici la mienne qui n’a pas été mentionnée auparavant. Cela fonctionne à partir de l'API 8+.
public class DetailActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
// toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// add back arrow to toolbar
if (getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// handle arrow click here
if (item.getItemId() == Android.R.id.home) {
finish(); // close this activity and return to preview activity (if there is any)
}
return super.onOptionsItemSelected(item);
}
Il y a plusieurs façons d'y parvenir, voici ma préférée:
Disposition:
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
app:navigationIcon="?attr/homeAsUpIndicator" />
Activité:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// back button pressed
}
});
vous pouvez utiliser la méthode setNavigationIcon de la barre d'outils. Android Doc
mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
mToolBar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleOnBackPress();
}
});
Si vous ne voulez pas créer un Toolbar
personnalisé, vous pouvez le faire comme ceci
public class GalleryActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setTitle("Select Image");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == Android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
}
En toi AndroidManifest.xml
<activity
Android:name=".GalleryActivity"
Android:theme="@style/Theme.AppCompat.Light">
</activity>
vous pouvez également mettre cette balise Android:theme="@style/Theme.AppCompat.Light"
en <aplication>
pour qu'elle s'applique à toutes les activités
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.drawable.back_arrow); // your drawable
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed(); // Implemented by activity
}
});
Et pour API 21+ Android:navigationIcon
<Android.support.v7.widget.Toolbar
Android:navigationIcon="@drawable/back_arrow"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"/>
J'ai utilisé cette méthode depuis le documentation pour les développeurs Google :
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
Si vous obtenez une exception de pointeur null, cela peut dépendre du thème. Essayez d’utiliser un thème différent dans le manifeste ou utilisez ceci alternativement:
@Override
public void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Ensuite, dans le manifeste, où je définis l'activité parente pour l'activité en cours:
<activity
Android:name="com.example.myapp.MyCurrentActivity"
Android:label="@string/title_activity_display_message"
Android:parentActivityName="com.example.myfirstapp.MainActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value="com.example.myapp.MyMainActivity" />
</activity>
J'espère que cela t'aidera!
Si vous étiez en utilisant AppCompatActivity
et êtes sur le point de ne pas l’utiliser, parce que vous ne voulez pas obtenir le ActionBar
automatique qu’il fournit, car vous souhaitez séparer la Toolbar
, en raison de vos besoins en matière de conception de matériau et CoordinatorLayout
ou AppBarLayout
, tenez compte de ceci:
Vous pouvez toujours utiliser le AppCompatActivity
, vous n'avez pas besoin de cesser de l'utiliser simplement pour pouvoir utiliser un <Android.support.v7.widget.Toolbar>
dans votre xml. Il suffit de désactiver la barre d’action style comme suit:
Tout d’abord, dérivez un style de l’un des thèmes NoActionBar que vous aimez dans votre styles.xml
, j’ai utilisé Theme.AppCompat.Light.NoActionBar
comme suit:
<style name="SuperCoolAppBarActivity" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/primary</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">@color/primary_dark</item>
...
...
</style>
Dans le manifeste de votre application, choisissez le thème de style enfant que vous venez de définir, comme suit:
<activity
Android:name=".activity.YourSuperCoolActivity"
Android:label="@string/super_cool"
Android:theme="@style/SuperCoolAppBarActivity">
</activity>
Dans votre activité XML, si la barre d'outils est définie comme suit:
...
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
/>
...
Ensuite, et c’est la partie importante, vous définissez la barre d’action de prise en charge de AppCompatActivity que vous étendez, de sorte que la barre d’outils de votre xml, devienne la barre d'action. J’estime que c’est un meilleur moyen, car vous pouvez tout simplement effectuer les nombreuses tâches autorisées par ActionBar, telles que les menus, le titre de l’activité automatique, la gestion de la sélection d’éléments, etc. sans recourir à l’ajout de gestionnaires de clics personnalisés, etc.
Dans le remplacement onCreate de votre activité, procédez comme suit:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_super_cool);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//Your toolbar is now an action bar and you can use it like you always do, for example:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Moyen simple et facile d'afficher le bouton de retour dans la barre d'outils
Collez ce code dans la méthode onCreate
if (getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
Coller cette méthode de remplacement en dehors de la méthode onCreate
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()== Android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
MyActivity extends AppCompatActivity {
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(arrow -> onBackPressed());
}
Dans le AppCompatActivity
par exemple, vous pouvez faire
public class GrandStatActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grand_stat);
}
@Override
public void onResume() {
super.onResume();
// Display custom title
ActionBar actionBar = this.getSupportActionBar();
actionBar.setTitle(R.string.fragment_title_grandstats);
// Display the back arrow
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
// Back arrow click event to go to the parent Activity
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
Vous pouvez facilement le faire.
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
Crédits: https://freakycoder.com/Android-notes-24-how-to-add-back-button-at-toolbar-941e6577418e
Dans le fichier manifeste de l'activité pour laquelle vous souhaitez ajouter un bouton Précédent, nous utiliserons la propriété Android: parentActivityName
<activity
Android:name=".WebActivity"
Android:screenOrientation="portrait"
Android:parentActivityName=".MainActivity"
/>
P.S. Cet attribut a été introduit dans l'API niveau 16.
Cela a parfaitement fonctionné
public class BackButton extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chat_box);
Toolbar chatbox_toolbar=(Toolbar)findViewById(R.id.chat_box_toolbar);
chatbox_toolbar.setTitle("Demo Back Button");
chatbox_toolbar.setTitleTextColor(getResources().getColor(R.color.white));
setSupportActionBar(chatbox_toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
chatbox_toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Define Back Button Function
}
});
}
}
private fun setupToolbar(){
toolbar.title = getString(R.string.YOUR_TITLE)
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
}
// don't forget click listener for back button
override fun onSupportNavigateUp(): Boolean {
onBackPressed()
return true
}
Ajoutez ceci au xml de l'activité dans le dossier de disposition:
<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/AppTheme.AppBarOverlay">
<Android.support.v7.widget.Toolbar
Android:id="@+id/prod_toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</Android.support.design.widget.AppBarLayout>
Rendre la barre d’outils cliquable, ajoutez-les à la méthode onCreate:
Toolbar toolbar = (Toolbar) findViewById(R.id.prod_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Si vous utilisez DrawerLayout avec ActionBarDrawerToggle , affichez Bouton Précédent au lieu du bouton Menu (et vice-versa), vous devez ajouter ce code dans votre activité:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.application_name, R.string.application_name);
mDrawerLayout.addDrawerListener(mDrawerToggle);
mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_arrow_back_white_32dp);
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onBackPressed(); // Or you can perform some other action here when Back button is clicked.
}
});
mDrawerToggle.syncState();
// ...
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item))
return true;
switch (item.getItemId()) {
case Android.R.id.home:
onBackPressed();
return true;
// ...
}
return super.onOptionsItemSelected(item);
}
public void showBackInToolbar(boolean isBack) {
// Remove next line if you still want to be able to swipe to show drawer menu.
mDrawerLayout.setDrawerLockMode(isBack ? DrawerLayout.LOCK_MODE_LOCKED_CLOSED : DrawerLayout.LOCK_MODE_UNLOCKED);
mDrawerToggle.setDrawerIndicatorEnabled(!isBack);
mDrawerToggle.syncState();
}
Ainsi, lorsque vous devez afficher le bouton Précédent au lieu du bouton Menu , appelez showBackInToolbar (true) , et si vous avez besoin du bouton Menu , appelez showBackInToolbar (false) .
Vous pouvez générer une flèche de retour (ic_arrow_back_white_32dp) ici , recherchez arrow_back dans Clipart section (utilisez par défaut 32dp avec 8dp padding). Il suffit de sélectionner la couleur que vous voulez.
Vous pouvez toujours ajouter un Relative layout
ou un Linear Layout
dans votre Toolbar
et placer une icône de vue d'image pour le dos ou une icône de fermeture n'importe où dans la barre d'outils, comme vous le souhaitez.
Par exemple, j'ai utilisé la disposition relative dans ma barre d'outils
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar_top"
Android:layout_width="match_parent"
Android:layout_height="35dp"
Android:minHeight="?attr/actionBarSize"
Android:nextFocusDown="@id/netflixVideoGridView"
app:layout_collapseMode="pin">
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Myflix"
Android:textAllCaps="true"
Android:textSize="19sp"
Android:textColor="@color/red"
Android:textStyle="bold" />
<ImageView
Android:id="@+id/closeMyFlix"
Android:layout_alignParentRight="true"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_vertical"
app:srcCompat="@drawable/vector_close" />
</RelativeLayout>
</Android.support.v7.widget.Toolbar>
Et ça ressemble à ça:
Vous pouvez ajouter un écouteur de clic sur cette vue d'image depuis Activity ou un fragment comme celui-ci.
closeMyFlix.setOnClickListener({
Navigator.instance.showFireTV( activity!!.supportFragmentManager)
})
Avec Kotlin c'est devenu:
Xml:
<include
Android:id="@+id/tbSignToolbar "
layout="@layout/toolbar_sign_up_in"/>
Dans votre activité: -
setSupportActionBar(tbSignToolbar as Toolbar?)//tbSignToolbar :id of your toolbar
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
Si vous souhaitez obtenir la flèche de retour sur une barre d'outils qui n'est pas définie en tant que votre SupportActionBar:
(kotlin)
val resId = getResIdFromAttribute(toolbar.context, Android.R.attr.homeAsUpIndicator)
toolbarFilter.navigationIcon = ContextCompat.getDrawable(toolbar.context, resId)
toolbarFilter.setNavigationOnClickListener { fragmentManager?.popBackStack() }
pour obtenir des res d'attributs:
@AnyRes
fun getResIdFromAttribute(context: Context, @AttrRes attr: Int): Int {
if (attr == 0) return 0
val typedValueAttr = TypedValue()
context.theme.resolveAttribute(attr, typedValueAttr, true)
return typedValueAttr.resourceId
}