Je migre d’ ActionBar
vers Toolbar
dans mon application. Mais je ne sais pas comment afficher et définir un événement de clic sur la flèche arrière sur la Toolbar
d’ 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à été confronté à cette situation et trouvé un moyen de le résoudre?
Si vous utilisez un ActionBarActivity
vous pouvez indiquer à Android d’utiliser la Toolbar
d’ Toolbar
comme ActionBar
comme ceci:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); setSupportActionBar(toolbar);
Et puis appelle à
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true);
marchera. Vous pouvez également utiliser cela dans 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 arrière sur une Toolbar
non définie comme 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 alors append le code suivant à votre AppCompatActivity
:
@Override public boolean onSupportNavigateUp() { onBackPressed(); return true; }
Je vois beaucoup de réponses mais voici la mienne qui n’est pas 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 mon préféré:
Disposition:
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(); } });
J’ai utilisé cette méthode à partir de Google Developer Documentation :
@Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); }
Si vous obtenez une exception de pointeur nul, cela peut dépendre du thème. Essayez d’utiliser un thème différent dans le manifeste ou utilisez-le alternativement:
@Override public void onCreate(Bundle savedInstanceState) { ... getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
Ensuite, dans le manifeste, où je définis l’activité parent pour l’activité en cours:
J’espère que cela t’aidera!
Si vous ne voulez pas créer une Toolbar
personnalisée, vous pouvez faire comme ça
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); } }
Dans vous AndroidManifest.xml
vous pouvez également mettre cet android:theme="@style/Theme.AppCompat.Light"
à la
, pour appliquer à toutes les activités
Si vous utilisiez AppCompatActivity
et que vous ne souhaitiez pas l’utiliser, car vous ne vouliez pas obtenir la Toolbar
automatique fournie, car vous souhaitez séparer la Toolbar
, en raison de vos besoins de conception de matériel et de CoordinatorLayout
ou AppBarLayout
, , considère ceci:
Vous pouvez toujours utiliser AppCompatActivity
, vous n’avez pas besoin de l’arrêter pour pouvoir utiliser un
dans votre fichier XML. Désactivez simplement le style de la barre d’action comme suit:
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 Theme.AppCompat.Light.NoActionBar
:
Dans le manifeste de votre application, choisissez le thème de style enfant que vous venez de définir, comme suit:
Dans votre activité XML, si la barre d’outils est définie comme suit:
... ...
Ensuite, et c’est la partie importante, vous définissez la barre d’actions de support sur AppCompatActivity que vous étendez, de sorte que la barre d’outils de votre fichier XML devienne la barre d’action. Je pense que c’est un meilleur moyen, car vous pouvez simplement faire les nombreuses choses qu’ActionBar permet, comme les menus, le titre d’activité automatique, la gestion de la sélection d’éléments, etc. sans avoir à append des gestionnaires de clics personnalisés, etc.
Dans la substitution 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); }
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
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()); }
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 } }); } }
Dans votre fichier manifeste pour l’activité où vous souhaitez append un bouton Retour, nous utiliserons la propriété Android: parentActivityName
PS Cet atsortingbut a été introduit dans API Level 16.
Moyen simple et facile pour afficher le bouton sur la barre d’outils
Collez ce code dans la méthode onCreate
if (getSupportActionBar() != null){ getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); }
Collez cette méthode de substitution 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); }
Dans 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.ssortingng.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; } }