Comment mettre en œuvre le bouton Retour ActionBar Android?

j'ai une activité avec listview. Lorsque l'utilisateur clique sur l'élément, l'élément "spectateur" 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 très bien, mais sur la barre d'action la flèche arrière à côté de l'icône de l'application ne s'active pas. Ai-je raté quelque chose?

98
demandé sur Jared Burrows 2012-04-11 19:09:57

8 réponses

Selvin a déjà posté la bonne réponse, Voici seulement la solution dans pretty 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) vous demande de définir l'activité de parent dans L'AndroidManifest.fichier 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

220
répondu surffan 2013-06-28 15:12:12

assurez-vous que le bouton Accueil ActionBar est activé dans L'activité:

Android, API 5+:

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

ActionBarSherlock and 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 avoir peuvent avoir la typographie.

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);
    }
}
138
répondu Jared Burrows 2015-04-08 14:21:25

pour activer le bouton arrière ActionBar, vous avez évidemment besoin D'un ActionBar 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 E. g le thème @android:style/Theme.NoTitleBar , vous n'avez pas de barre d'action. Dans ce cas, l'appel à getActionBar() retournera null. Assurez-vous d'abord d'avoir un ActionBar.

la prochaine étape est de mettre le android:parentActivityName à l'activité que vous voulez naviguer si vous appuyez sur le bouton de retour. Cela devrait être fait dans les AndroidManfiest.xml .

maintenant vous pouvez activer le bouton arrière dans la méthode onCreate de votre activité" enfant".

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

maintenant vous devez mettre en œuvre la logique pour le bouton de retour. Il vous suffit de remplacer la méthode onOptionsItemSelected dans votre activité "enfant" et de vérifier l'id du bouton arrière qui est android.R.id.home .

Maintenant vous pouvez utiliser la méthode NavUtils.navigateUpFromSameTask(this); Mais si vous n'avez pas spécifié le android:parentActivityName en vous AndroidManfiest.xml cela va planter votre application.

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

dans ce cas, vous pouvez utiliser la méthode onBackPressed() qui fait essentiellement le comme si l'utilisateur pressait le bouton arrière de l'appareil. Une bonne mise en œuvre que jamais crashs vous app 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 qui la route que vous prenez, mais j'ai trouvé la solution utile, surtout si vous utilisez une classe de base pour toutes vos activités.

11
répondu dknaack 2014-08-03 04:05:20

Annotations Android:

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

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

7
répondu ldd 2014-08-19 14:24:19

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 en détail activité:

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

c'est du travail :]

7
répondu Sågär Śåxëńá 2016-04-15 08:59:19

je pense onSupportNavigateUp() est la plus simple et la meilleure façon de le faire

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

4
répondu Inzimam Tariq IT 2017-05-23 12:34:41

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

pour réaliser ceci, il y a simplement deux étapes,

Étape 1: Allez à Androïdmanifest.xml et ajouter le paramètre dans tag-android:parentActivityName=".maison.HomeActivity"

exemple:

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

Etape 2: dans ActivityDetail ajouter votre action pour la page/l'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
répondu Vivek Hande 2017-10-24 06:53:35

les étapes suivantes sont suffisantes pour appuyer sur le bouton:

Étape 1: Ce code doit être dans le Manifeste.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 n'aurez pas de donner des

finish();

dans votre activité de Parent au début de L'activité de L'enfant.

Étape 3: Si vous avez besoin de revenir à L'activité de Parent de L'activité de L'enfant, alors vous donnez juste ceci code de l'Activité de l'Enfant.

startActivity(new Intent(ParentActivity.this, ChildActivity.class));
0
répondu Kumar VL 2018-04-10 07:26:53