web-dev-qa-db-fra.com

Comment implémenter le bouton de retour Android ActionBar?

J'ai une activité avec une listview. Lorsque l'utilisateur clique sur l'élément, l'élément "visualiseur" s'ouvre:

List1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

        Intent nextScreen = new Intent(context,ServicesViewActivity.class);
        String[] Service = (String[])List1.getItemAtPosition(arg2);

        //Sending data to another Activity
        nextScreen.putExtra("data", datainfo);
        startActivityForResult(nextScreen,0);
        overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
    }
});

Cela fonctionne bien, mais sur la barre d’action, la flèche vers le bas à côté de l’icône de l’application ne s’active pas. Est-ce que je manque quelque chose?

110
Joaolvcm

Selvin a déjà posté la bonne réponse, voici seulement la solution dans un joli code ;-)

public class ServicesViewActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // etc...
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case Android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

La fonction NavUtils.navigateUpFromSameTask(this) nécessite que vous définissiez l'activité parente dans le fichier AndroidManifest.xml.

    <activity Android:name="com.example.ServicesViewActivity" >
            <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="com.example.ParentActivity" />
    </activity>

http://developer.Android.com/design/patterns/navigation.html#up-vs-back

232
surffan

Assurez-vous que le bouton Accueil de la barre Action est activé dans l'activité:

Android, API 5+:

@Override
public void onBackPressed() {
     ...
     super.onBackPressed();
}

ActionBarSherlock et App-Compat, API 7+:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Android, API 11+:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

Exemple MainActivity qui étend ActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case Android.R.id.home: 
            // API 5+ solution
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

De cette façon, toutes les activités que vous voulez peuvent avoir la contre-pression.

Android, API 16+:

http://developer.Android.com/training/implementing-navigation/ancestral.html

AndroidManifest.xml:

<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.DisplayMessageActivity"
        Android:label="@string/title_activity_display_message"
        Android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

Exemple MainActivity qui étend ActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @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);
    }
}
145
Jared Burrows

Pour activer le bouton de retour de la barre d’action, vous avez évidemment besoin d’une barre d’action dans votre activité. .__ Ceci est défini par le thème que vous utilisez. Vous pouvez définir le thème de votre activité dans le AndroidManfiest.xml. Si vous utilisez par exemple le thème @Android:style/Theme.NoTitleBar, vous n’avez pas de barre d’action. Dans ce cas, l'appel à getActionBar() renverra null. Assurez-vous d’abord d’avoir un ActionBar.

L'étape suivante consiste à définir le Android:parentActivityName sur l'activité à laquelle vous souhaitez naviguer si vous appuyez sur le bouton Précédent. Cela devrait aussi être fait dans le AndroidManfiest.xml.

Vous pouvez maintenant activer le bouton Précédent dans la méthode onCreate de votre activité "enfant".

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

Maintenant, vous devez implémenter la logique du bouton Précédent. Vous substituez simplement la méthode onOptionsItemSelected dans votre activité "enfant" et recherchez l'id du bouton Précédent qui est Android.R.id.home

Vous pouvez maintenant déclencher la méthode NavUtils.navigateUpFromSameTask(this);MAISsi vous n'avez pas spécifié le Android:parentActivityName dans votre AndroidManfiest.xml, votre application sera bloquée. 

Parfois, c'est ce que vous voulez parce que cela vous rappelle que vous avez oublié "quelque chose", mais si vous voulez éviter cela, vous pouvez vérifier si votre activité a un parent utilisant la méthode getParentActivityIntent(). Si cela retourne null, vous n'avez pas spécifié le parent.

Dans ce cas, vous pouvez activer la méthode onBackPressed() qui fonctionne fondamentalement comme si l'utilisateur appuyait sur le bouton Précédent de l'appareil. Une bonne implémentation qui ne planterait jamais votre application serait 

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case Android.R.id.home:
            if (getParentActivityIntent() == null) {
                Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!");
                onBackPressed();
            } else {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Veuillez noter que l'animation que l'utilisateur voit est différente entre NavUtils.navigateUpFromSameTask(this); et onBackPressed().

C’est à vous de choisir votre route, mais j’ai trouvé la solution utile, surtout si vous utilisez une classe de base pour toutes vos activités.

13
dknaack

Fichier AndroidManifest:

    <activity Android:name=".activity.DetailsActivity">
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="br.com.halyson.materialdesign.activity.HomeActivity" />
    </activity>

ajouter dans DetailsActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

c'est du travail :]

8

Annotations Android:

@OptionsItem(Android.R.id.home)
void homeSelected() {
    onBackPressed();
}

Source: https://github.com/excilys/androidannotations

7
ldd

Je pense que onSupportNavigateUp() est le moyen le plus simple et le meilleur de le faire

vérifier le code dans ce lien Cliquez ici pour le code complet

4
Inzimam Tariq IT

https://stackoverflow.com/a/46903870/4489222

Pour y parvenir, il y a simplement deux étapes,

Étape 1: Allez dans AndroidManifest.xml et ajoutez le paramètre dans la balise - Android: parentActivityName = ". Home.HomeActivity"

exemple :

 <activity
    Android:name=".home.ActivityDetail"
    Android:parentActivityName=".home.HomeActivity"
    Android:screenOrientation="portrait" />

Étape 2: dans ActivityDetail, ajoutez votre action pour la page/activité précédente

exemple :

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
      case Android.R.id.home: 
          onBackPressed();
          return true;
   }
   return super.onOptionsItemSelected(item);}
}
2
Vivek Hande

Si vous utilisez Toolbar, je faisais face au même problème. J'ai résolu en suivant ces deux étapes

  1. Dans le fichier AndroidManifest.xml
<activity Android:name=".activity.SecondActivity" Android:parentActivityName=".activity.MainActivity"/>
  1. Dans la deuxième activité, ajoutez ces ...
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
1
user2823506

Dans la méthode OnCreate, ajoutez ceci:

if (getSupportActionBar() != null)
    {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

Puis ajoutez cette méthode:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
1
Marco Concas
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

dans la méthode onCreated pour les nouveaux apis.

1
Kartik Garasia

Les étapes suivantes sont bien suffisantes pour revenir en arrière:

Étape 1: Ce code devrait être dans Manifest.xml 

<activity Android:name=".activity.ChildActivity"
        Android:parentActivityName=".activity.ParentActivity"
        Android:screenOrientation="portrait">
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value=".activity.ParentActivity" /></activity>

Étape 2: Vous ne donnerez pas 

finish();

dans votre activité parent en commençant l'activité enfant.

Étape 3: Si vous devez revenir à Activité parent à partir d’activité enfant, vous devez alors donner ce code pour activité enfant.

startActivity(new Intent(ParentActivity.this, ChildActivity.class));
0
Kumar VL