Flèche de retour sur la barre D'outils
je passe de ActionBar
à Toolbar
dans ma demande.
Mais je ne sais pas comment afficher et définir l'événement de clic sur la flèche de retour sur Toolbar
comme je l'ai fait sur Actionbar
.
avec ActionBar
, j'appelle mActionbar.setDisplayHomeAsUpEnabled(true)
.
Mais il n'est pas la même méthode de ce genre.
Quelqu'un a-t-il déjà fait face à cette situation et a-t-il trouvé un moyen de la résoudre?
13 réponses
si vous utilisez un ActionBarActivity
alors vous pouvez dire à Android d'utiliser le Toolbar
comme le ActionBar
comme suit:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
puis appelle
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
fonctionnera. Vous pouvez également l'utiliser dans les Fragments qui sont 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 voulez obtenir la flèche arrière sur un Toolbar
qui n'est pas défini comme votre SupportActionBar
, alors vous pouvez utiliser ce qui suit:
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'est pas mentionné avant. Il 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é:
Modèle:
<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 barre d'outils setNavigationIcon méthode. 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 de la 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 cette alternative:
@Override
public void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
puis dans le manifeste, où je fixe l'activité principale pour l'activité courante:
<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 vous aidera!
si vous ne voulez pas créer un personnalisé Toolbar
, vous pouvez 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 vous AndroidManifest.xml
<activity
android:name=".GalleryActivity"
android:theme="@style/Theme.AppCompat.Light"
>
</activity>
vous pouvez aussi mettre ce android:theme="@style/Theme.AppCompat.Light"
à <aplication>
étiquette, pour s'appliquer à toutes les activités
si vous étiez en utilisant AppCompatActivity
et avez suivi le chemin de ne pas l'utiliser, parce que vous vouliez ne pas obtenir le automatique ActionBar
qu'il fournit, parce que vous voulez séparer le Toolbar
, en raison de vos besoins de conception de matériaux et CoordinatorLayout
ou AppBarLayout
, alors, considérez ceci:
Vous pouvez toujours utiliser le AppCompatActivity
, vous n'avez pas besoin d'arrêter de l'utiliser de sorte que vous pouvez utiliser un <android.support.v7.widget.Toolbar>
dans votre xml. Il suffit d'éteindre la barre d'action style comme suit:
tout d'abord, dériver un style de l'un des thèmes NoActionBar que vous aimez dans votre styles.xml
, j'ai utilisé Theme.AppCompat.Light.NoActionBar
comme ainsi:
<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 ceci:
<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 ainsi:
...
<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 soutien à L'Appcompatibilité que vous étendez, de sorte que la barre d'outils dans votre xml, devient la barre d'action. Je pense que c'est une meilleure façon, parce que vous pouvez simplement faire les nombreuses choses Qu'ActionBar permet, comme les menus, le titre de l'activité automatique, la manipulation de sélection d'article, etc. sans recourir à l'ajout de gestionnaires de clic personnalisés, etc.
dans votre L'activité onCreate remplacer, procédez de la manière suivante:
@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
<android.support.v7.widget.Toolbar
android:navigationIcon="@drawable/back_arrow"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"/>
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 fonctionné parfaitement
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 de manifeste pour l'activité où vous voulez ajouter un bouton arrière, nous allons utiliser la propriété android:parentActivityName
<activity
android:name=".WebActivity"
android:screenOrientation="portrait"
android:parentActivityName=".MainActivity"
/>
P.S. cet attribut a été introduit au niveau 16 de L'API.
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;
}
}
façon Simple et facile de montrer le bouton arrière sur la barre d'outils
coller ce code dans la méthode onCreate
if (getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
Coller ce remplacer la méthode 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);
}