149 votes

Comment mettre en œuvre le bouton retour de la barre d'action Android ?

J'ai une activité avec une vue de liste. Lorsque l'utilisateur clique sur l'élément, la "visionneuse" de l'élément 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 dans la barre d'action, la flèche de retour à côté de l'icône de l'application ne s'active pas. Est-ce que quelque chose m'échappe ?

66 votes

getActionBar().setDisplayHomeAsUpEnabled(true); dans onCreate et switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;} sur onOptionsItemSelected ? les deux dans ServicesViewActivity

8 votes

Pourquoi ne pas répondre par des étagères ?

282voto

surffan Points 917

Selvin a déjà posté la bonne réponse. Ici, la solution en 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 de définir 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>

Voir ici pour une lecture plus approfondie.

1 votes

Dans ma situation, je cherchais un moyen de ne pas appeler onCreate du parent lorsqu'on y retourne. Pour ce faire, j'ai utilisé votre implémentation, mais j'ai appelé finish() au lieu de NavUtils.navigateUpFromSameTask(this). finish() appelle mon onStart au lieu de onCreate, ce qui était plus idéal pour moi.

0 votes

La définition des méta-données dans le manifeste est essentielle pour faire fonctionner le bouton de navigation.

0 votes

Utilisez getActionBar().setDisplayHomeAsUpEnabled(true); au cas où vous utiliseriez des bibliothèques de soutien.

186voto

Jared Burrows Points 3932

Assurez-vous que le bouton d'accueil de la barre d'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(@Nullable Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Android, API 11+ :

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

Exemple MainActivity qui s'étend ActionBarActivity :

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable 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 le backpress.

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 s'étend ActionBarActivity :

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable 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);
    }
}

0 votes

Cela fonctionne pour moi lorsque je change getSupportActionBar().setDisplayHomeAsUpEnabled(true) ; en getActionBar().setDisplayHomeAsUpEnabled(true) ; et que j'ajoute ces @SuppressLint("NewApi") à la méthode onCreate inside et outsideFor REF : =>. developer.Android.com/training/implementation-navigation/

1 votes

@ganpath Attention, utiliser getActionBar c'est pour API 11+ .

23voto

dknaack Points 26873

Pour activer le bouton de retour de la barre d'action, vous avez évidemment besoin d'une barre d'action dans votre activité. Celle-ci est définie par le thème que vous utilisez. Vous pouvez définir le thème de votre activité dans le champ AndroidManfiest.xml . Si vous utilisez, par exemple, le @android:style/Theme.NoTitleBar vous n'avez pas de barre d'action. Dans ce cas, l'appel à getActionBar() retournera null. Assurez-vous donc d'avoir d'abord une barre d'action.

L'étape suivante consiste à définir le android:parentActivityName à l'activité dans laquelle vous voulez naviguer si vous appuyez sur le bouton de retour. Cette opération doit être effectuée dans la section AndroidManifest.xml aussi.

Maintenant, vous pouvez activer le bouton retour dans le onCreate de votre activité "enfant".

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

Maintenant, vous devez implémenter la logique pour le bouton retour. Il suffit de remplacer la fonction onOptionsItemSelected dans votre activité "enfant" et vérifiez l'id du bouton retour qui est android.R.id.home .

Vous pouvez maintenant lancer la méthode NavUtils.navigateUpFromSameTask(this); MAIS si vous n'avez pas spécifié l'option android:parentActivityName en vous AndroidManifest.xml cela fera planter votre application.

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

Dans ce cas, vous pouvez lancer le onBackPressed() qui fait essentiellement la même chose que si l'utilisateur appuyait sur le bouton retour de l'appareil. Une bonne implémentation qui ne plantera 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 la voie que vous voulez suivre, mais j'ai trouvé cette solution utile, surtout si vous utilisez une classe de base pour toutes vos activités.

20voto

Marco Concas Points 329

Dans le OnCreate ajoutez ceci :

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

Ajoutez ensuite cette méthode :

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

11voto

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 le travail :]

1 votes

Il semble que ce soit le moyen le plus simple pour moi. Je vous remercie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X