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?
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
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);
}
}
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.
Annotations Android:
@OptionsItem(android.R.id.home)
void homeSelected() {
onBackPressed();
}
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 :]
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
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);}
}
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));