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?
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
Assurez-vous que le bouton Accueil de la barre Action est activé dans l'activité:
@Override
public void onBackPressed() {
...
super.onBackPressed();
}
@Override
public void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@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.
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);
}
}
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.
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 :]
@OptionsItem(Android.R.id.home)
void homeSelected() {
onBackPressed();
}
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
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);}
}
Si vous utilisez Toolbar, je faisais face au même problème. J'ai résolu en suivant ces deux étapes
<activity Android:name=".activity.SecondActivity" Android:parentActivityName=".activity.MainActivity"/>
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
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;
}
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
dans la méthode onCreated
pour les nouveaux apis.
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));