Dans de nombreuses applications (Agenda, Drive, Play Store), lorsque vous appuyez sur un bouton et entrez une nouvelle activité, l'icône dans la barre de titre se transforme en bouton Précédent, mais l'application que je crée ne le fait pas. Comment faire pour que cette icône vous ramène à l'écran précédent?
Il existe deux étapes simples pour créer un bouton de retour dans la barre de titre:
Tout d’abord, activez l’icône de l’application en utilisant le code suivant dans l’activité dont vous voulez insérer le bouton Précédent dans la barre de titre:
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
Une fois que vous avez ajouté le code ci-dessus, une flèche arrière apparaît à gauche de l'icône de l'application.
Deuxièmement, une fois que vous avez effectué ce qui précède, vous devez toujours créer un code qui tirera parti de l'événement click. Pour ce faire, sachez que lorsque vous cliquez sur l'icône de l'application, une méthode onOptionsItemSelected
est appelée. Donc, pour revenir à l'activité précédente, ajoutez cette méthode à votre activité et mettez-y le code Intent
qui vous ramènera à l'activité précédente. Par exemple, supposons que l'activité que vous essayez de retourner à s'appelle MyActivity
. Pour y revenir, écrivez la méthode comme suit:
public boolean onOptionsItemSelected(MenuItem item){
Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
C'est ça!
(Dans l'API de développeurs Android, il est recommandé de manipuler le manifeste et d'ajouter des éléments tels que Android:parentActivityName
. Mais cela ne semble pas fonctionner pour moi. Ce qui précède est plus simple et plus fiable.)
<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value=".MainActivity" />
Et dans ton activité
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
utiliser ce code
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
après cela, écrivez ce code dans la méthode onOptionsItemSelected
int id = item.getItemId();
if (id==Android.R.id.home) {
finish();
}
J'ai enfin réussi à ajouter correctement le bouton de retour à la barre d'action/barre d'outils
@Override
public void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
1.- Ajoutez l'activité à AndroidManifest.xml et assurez-vous de fournir les méta-données:
<activity
Android:name="com.example.myfirstapp.DisplayMessageActivity"
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.myfirstapp.MainActivity" />
</activity>
2.- Ajoutez le code suivant à la méthode onCreate de l'activité:
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
3.- Remplacez onOptionsItemSelected et utilisez la méthode statique NavUtils.navigateUpFromSameTask () pour naviguer et jeter la pile.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case Android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Cependant, l'utilisation de browseUpFromSameTask () ne convient que lorsque votre application est propriétaire de la tâche en cours (c'est-à-dire que l'utilisateur a démarré cette tâche à partir de votre application). Si ce n'est pas le cas et que votre activité a été démarrée dans une tâche appartenant à une application différente, la navigation vers le haut doit créer une nouvelle tâche appartenant à votre application, ce qui nécessite la création d'une nouvelle pile d'arrière-plan.
Si votre activité prolonge l'activité
public class YourActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xxx);
getActionBar().setHomeButtonEnabled(true);
[...]
}
[...]
}
Si votre action prolonge AppCompatActivity
public class YourActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xxx);
getSupportActionBar().setHomeButtonEnabled(true);
[...]
}
[...]
}
Rien à faire , voir action d'ajout
[FACULTATIF] Pour définir explicitement l'activité parent, modifiez votre fichier Manifest.xml comme suit:
<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
Android:name="com.example.myfirstapp.MainActivity" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
Android:name="com.example.myfirstapp.YourActivity "
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.myfirstapp.MainActivity" />
</activity>
</application>
tout d'abord dans onCreate Function ajouter la ligne suivante
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
puis ajoutez la fonction suivante dans le code:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
La manière la plus simple et la meilleure pratique, comme l'explique google ici :
1.Ajouter un parent pour votre enfantActivité dans le AndroidManifest.xml
:
<activity
Android:name=".ChildActivity"
Android:parentActivityName=".ParentActivity" >
</activity>
2.Activez le bouton retour dans votre enfantActivité:
myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);
Travaillé pour moi, j'espère que cela fonctionne pour vous aussi.
Si vous utilisez la nouvelle bibliothèque de support pour la version 5.1 dans Android studio, vous pouvez plutôt l'utiliser sur votre AppCompatActivity.
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
actionBar.setDisplayShowHomeEnabled(true);
à votre santé.
Vous devez d’abord écrire ces codes
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Ajoutez ensuite cette ligne dans le manifeste
<activity Android:name=".MainActivity"
Android:parentActivityName=".PreviousActivity"></activity>
Je pense que cela va fonctionner
Si votre activité s'étend AppCompatActivity
, vous devez remplacer la méthode onSupportNavigateUp()
de la manière suivante:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
...
}
@Override
public void onBackPressed() {
super.onBackPressed();
this.finish();
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
Gérez votre logique dans votre méthode onBackPressed()
et appelez-la simplement dans onSupportNavigateUp()
pour que le bouton Précédent du téléphone et la flèche de la barre d'outils fassent de même.
Version légère sans utiliser ActionBarActivity
qui a toujours les mêmes comportements ici:
public class ToolbarConfigurer implements View.OnClickListener {
private Activity activity;
public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
toolbar.setTitle((this.activity = activity).getTitle());
if (!displayHomeAsUpEnabled) return;
toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
toolbar.setNavigationOnClickListener(this);
}
@Override
public void onClick(View v) {
NavUtils.navigateUpFromSameTask(activity);
}
}
Utilisation: Mettez new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);
dans onCreate
.
Vous devez ajouter le code mentionné ci-dessous dans le fichier manifeste. Recherchez l'activité dans laquelle vous souhaitez ajouter la fonctionnalité de flèche arrière. Si vous trouvez celui-ci alors bien ou créez l'activité
<activity Android:name=".SearchActivity">
</activity>
Ajoutez ensuite les trois lignes de code suivantes entre les deux.
<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value="com.example.raqib.instadate.MainActivity" />
Et n'oubliez pas d'ajouter ce morceau de code dans onCreate (); méthode de votre activité particulière dans laquelle vous avez besoin de la flèche arrière.
Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
setSupportActionBar(toolbar);
try{
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}catch(NullPointerException e){
Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
}
Voici comment j'ai résolu le problème. Merci.
J'avais besoin de mélanger quelques réponses pour obtenir la bonne réponse car mon application propose trois activités pouvant aller et retour à tout moment. Activité1> Activité2> Activité3. Lorsque je faisais quelque chose sur mon activité3, le bouton Précédent était correctement sauvegardé sur Activité2. Cependant, à partir de l’Activité2, à l’aide de finish()
, il s’appuyait sur Activité3 et non sur Activité1. Et j'étends AppCompatActivity. Donc, ma solution était:
public class Activity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setHomeButtonEnabled(true);
}
}
sur AndroidManifest.xml:
<activity Android:name=".activities.Activity2"
Android:parentActivityName="com.example.appname.activities.Activity1">
<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value="com.example.appname.activities.Activity1" />
</activity>
et enfin, le bouton d'action de mon menu (barre d'action):
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
...
case Android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Utiliser NavUtils.navigateUpFromSameTask(this);
a fonctionné pour moi, au lieu de finish()
.
Si vous utilisez un ActionBar, vous souhaiterez lire cette documentation http://developer.Android.com/reference/Android/app/ActionBar.html#setDisplayHomeAsUpEnabled (boolean)
Ensuite, vous devez écraser la méthode onOptionsItemSelected (MenuItem) et rechercher l'événement Android.R.id.home à entrer. Ensuite, vous savez que l'utilisateur a cliqué sur ce bouton de retour dans la barre d'actions.
Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (getSupportActionBar()==null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==Android.R.id.home)
finish();
return super.onOptionsItemSelected(item);
}
Vous pouvez aussi simplement mettre onBackPressed()
dans votre écouteur onClick. Cela fait en sorte que votre bouton se comporte comme les boutons par défaut "back/up" dans Android apps!
Vous pouvez également le faire sans code en spécifiant une activité parent dans le manifeste de l'application. Si vous souhaitez un bouton de retour dans l'activité B pour accéder à l'activité A, ajoutez simplement l'activité A en tant que parent de l'activité B dans le manifeste.
Les autres réponses ne précisent pas que vous pouvez également définir cela dans le code XML de votre widget Toolbar
:
app:navigationIcon="?attr/homeAsUpIndicator"
Par exemple:
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:navigationIcon="?attr/homeAsUpIndicator"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/title_activity_acoustic_progress" />
Partager juste quelque chose qui m'a aidé et peut être utile pour d'autres. Bien que la plupart des réponses ici soient correctes, en utilisant la getActionBar().setDisplayHomeAsUpEnabled(true);
, cela ne fonctionnait pas pour moi. Le problème que j’ai eu, c’est que j’essayais de créer une deuxième activité manuellement, mais il ya plus de détails.
Ce qui a vraiment résolu mon problème était de suivre Android Tutoriel pour développeurs ( https://developer.Android.com/training/basics/firstapp/starting-activity ) pour créer une deuxième activité à l'aide de Android propres outils de Studio:
Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.
Cela fonctionne pour moi .. Supposons qu'il y ait deux activités (Activityone, Activitytwo)
Inside Activitytwo utiliser ce code
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
On Activityone
//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));
Ceci devrait être inclus dans la deuxième activité du fichier manifeste
<activity Android:name=".Activitytwo"
Android:parentActivityName=".Activityone"></activity>
Et le résultat serait comme ceci
Pour le kotlin:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
onBackPressed();
return true;
}