Activité parentale définie dynamiquement

Donc, au moment où j'ai une activité pouvant être atteinte à partir de deux activités différentes, le problème est que je ne peux définir qu'une activité comme activité parent dans le fichier manifeste XML. De toute évidence, c'est une mauvaise conception UX / UI car l'activité peut envoyer l'utilisateur à la mauvaise activité qu'ils étaient auparavant et j'essaie de définir dynamiquement quelle activité est l'activité parent.

Le problème est que je ne suis pas sûr de savoir comment y aller, que ce soit dans le code ou XML, de sorte que les pointeurs sont appréciés. 🙂

  • Référence du fragment imbriqué de FragmentTabHost
  • Décryptage AES sur Android trop lent pour être utilisable. NDK sera plus rapide? D'autres idées?
  • Conversion de l'image de ressource desséchable en bitmap
  • Erreur: le chemin source n'existe pas: resources \ android \ icon \ drawable-hdpi-icon.png
  • Lancer une application depuis une autre application sur Android
  • Installation du plug-in Android NDK dans eclipse SDK
  • 7 Solutions collect form web for “Activité parentale définie dynamiquement”

    Il y a deux concepts en jeu ici 'Up' et 'Back'. Le retour est l'évident: amenez-moi à l'endroit où je viens juste avant que je vienne ici. Généralement, vous n'avez pas besoin de vous préoccuper de 'Retour', car le système va bien le gérer. 'Up' n'est pas si évident: il est analogue à Zoom Out – d'un élément à la collection, d'un détail à l'image plus large.

    Lequel de ceux-ci correspond à votre cas d'utilisation?


    Selon le commentaire ci-dessous: le bouton haut tire la destination du manifeste Android, mais il peut être personnalisé par programmation .

    Pour les futurs lecteurs, voici un exemple de la façon de mettre en œuvre la solution officielle / correcte selon les guides du développeur (faites défiler jusqu'au paragraphe commençant par "Ceci est approprié lorsque l'activité parent peut être différente … " ).

    Notez que cette solution suppose que vous utilisez la bibliothèque de support pour implémenter votre ActionBar et que vous pouvez au moins définir une activité parentale «par défaut» dans votre fichier XML manifeste pour revenir sur si l'activité dont vous êtes en retrait est dans une «tâche» Cela n'appartient pas à votre application (lire les documents liés pour obtenir des éclaircissements).

     // Override BOTH getSupportParentActivityIntent() AND getParentActivityIntent() because // if your device is running on API 11+ it will call the native // getParentActivityIntent() method instead of the support version. // The docs do **NOT** make this part clear and it is important! @Override public Intent getSupportParentActivityIntent() { return getParentActivityIntentImpl(); } @Override public Intent getParentActivityIntent() { return getParentActivityIntentImpl(); } private Intent getParentActivityIntentImpl() { Intent i = null; // Here you need to do some logic to determine from which Activity you came. // example: you could pass a variable through your Intent extras and check that. if (parentIsActivityA) { i = new Intent(this, ActivityA.class); // set any flags or extras that you need. // If you are reusing the previous Activity (ie bringing it to the top // without re-creating a new instance) set these flags: i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); // if you are re-using the parent Activity you may not need to set any extras i.putExtra("someExtra", "whateverYouNeed"); } else { i = new Intent(this, ActivityB.class); // same comments as above i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); i.putExtra("someExtra", "whateverYouNeed"); } return i; } 

    REMARQUE: si vous ne définissez pas une activité principale par défaut dans le fichier XML manifeste, vous devrez également implémenter onCreateSupportNavigateUpTaskStack () car le système n'aura aucune idée de la façon de générer un backstack pour votre tâche. Je n'ai fourni aucun exemple pour cette partie.

    Mes pensées sur les solutions de type finish()

    En ce qui concerne la recherche d'une solution à ce problème, j'ai rencontré quelques réponses qui préconisent la stratégie de onOptionsItemSelected() et d'interception du bouton android.R.id.home afin qu'ils puissent simplement finish() l' Activity actuelle pour revenir à la précédente écran.

    Dans de nombreux cas, cela permettra d'atteindre le comportement souhaité, mais je tiens à souligner que ce n'est certainement pas le même que la navigation UP appropriée. Si vous naviguez vers l'activité enfant par l'une des activités principales, alors oui finish() vous ramènera à l'écran précédent approprié, mais que faire si vous avez entré l'activité enfant par une notification? Dans ce cas, finish() en appuyant sur le bouton HAUT, vous reviendrait directement sur l'écran d'accueil ou n'importe quelle application que vous visualisiez avant d'accéder à la notification, alors qu'il devrait vous avoir envoyé à une activité parentale appropriée dans votre application.

    De cette façon, vous pouvez naviguer de manière dynamique vers votre activité parentale:

     getActionBar().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: finish(); return true; } return super.onOptionsItemSelected(item); } 

    REMARQUE: il vous redirige vers l'activité ou le fragment d'origine, que ce soit parent ou non. En cliquant sur la barre d'action, le bouton Haut / Accueil terminera l'activité actuelle.

    Pour savoir comment utiliser Up Navigation, consultez correctement ce Guide de développement Android.

    Notez qu'il y a un grand défaut dans le Guide de développement Android ci-dessus car les fonctions NavUtils fonctionnent différemment pour ICS (et plus bas) et JellyBean (et plus). Ce défaut dans NavUtils est très bien illustré ici.

    La méthode à remplacer est getParentActivityIntent.

    Voici mon code et fonctionne parfaitement.

     @Override public Intent getParentActivityIntent() { Intent parentIntent= getIntent(); String className = parentIntent.getStringExtra("ParentClassSource"); Intent newIntent=null; try { //you need to define the class with package name newIntent = new Intent(OnMap.this, Class.forName(className)); } catch (ClassNotFoundException e) { e.printStackTrace(); } return newIntent; } 

    Des activités parentales;

     Intent i = new Intent(DataDetailsItem.this, OnMap.class); i.putExtra("ParentClassSource", "com.package.example.YourParentActivity"); startActivity(i); 

    Généralement, un type d'activité «détail» devra fournir la navigation «en haut» s'il contient des contenus imbriqués ou connexes. La navigation «arrière» est gérée par le système afin que vous ne vous inquiétez vraiment pas.

    Maintenant, pour l'effort supplémentaire pour soutenir la navigation «haut», il existe quelques façons de le faire:

    1. Activité qui a l'activité parent définie dans AndroidManifest.

       Your Android Manifest --------------------- <activity android:name="com.example.app.DetailActivity" android:parentActivityName="com.example.app.MainActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app.MainActivity" /> </activity> Your Detail Activity -------------------- @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } 

      Cela fonctionne bien s'il n'y a qu'une activité parentale si la (DetailActivity) est toujours lancée depuis (MainActivity). Sinon, cette solution ne fonctionnera pas si (DetailActivity) est lancé depuis différents endroits. Plus ici: http://developer.android.com/training/implementing-navigation/ancestral.html

    2. (Plus facile et recommandée) Activité avec Fragment et Fragment back-stack:

       Your Detail Activity -------------------- protected void replaceFragment(Bundle fragmentArguments, boolean addToBackStack) { DetailFragment fragment = new DetailFragment(); fragment.setArguments(fragmentArguments); // get your fragment manager, native/support FragmentTransaction tr = fragmentManager.beginTransaction(); tr.replace(containerResId, fragment); if (addToBackStack) { tr.addToBackStack(null); } tr.commit(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } 

      Dans cette solution, si l'utilisateur appuie sur 'arrière', le fragment sera extrait du fragment de fragments et l'utilisateur est ramené au fragment précédent tout en demeurant dans la même activité. Si l'utilisateur appuie sur 'up', l'activité est rejetée et l'utilisateur est renvoyé à l'activité précédente (étant l'activité parent). La clé ici est d'utiliser le Fragment comme votre interface utilisateur et l'activité comme hôte du fragment.

    J'espère que cela t'aides.

    Vous devrez suivre l'activité parentale. Une façon de le faire est de le stocker en tant que supplément dans l'intention que vous créez pour commencer l'activité enfant). Par exemple, si l'activité A commence l'activité B, conservez l'intention de A dans l'intention créée pour B. Ensuite, dans l' onOptionsItemSelected de B, où vous gérez la navigation vers le haut, récupérez l'intention de A et commencez par les drapeaux d'intention souhaités.

    La publication suivante comporte un cas d'utilisation plus complexe avec une chaîne d'activités enfant. Il explique comment vous pouvez naviguer vers la même ou nouvelle instance du parent et finir les activités intermédiaires tout en le faisant.

    Navigation sur Android pour une activité avec plusieurs parents

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.