0

Je développe une application qui contient TabHost, dans un de ces onglets j'ai un ActivityGroup, et de ce ActivityGroup, je lance un autre SubActivity (disons que je lance un Activity A) et jusqu'à ce que tout soit OK.Naviguer entre les activités dans un ActivityGroup

Le problème est quand je presse la BackButton, le CurrentActivity (Activity A) est détruit, mais le ParentActivity (Le ActivityGroup) ne reprend pas, et le spectacle app juste une fenêtre nulle avec le titre de My App ("Mon titre d'application").

Le code pour lancer le Activity A de mon ActivityGroup est:

View view = getLocalActivityManager().startActivity(id,newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView(); 
this.setContentView(view); 

et j'ai overrided la méthode onKeyDown comme ça dans mon ActivityGroup:

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     Log.i(TAG, "onKeyDown"); 
     if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){ 
      Activity current = getLocalActivityManager().getCurrentActivity(); 
      Log.i(TAG, current.getIntent().getStringExtra("id")); 
      current.finish(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

mais il semble que la méthode onKeyDown n'est jamais appelé parce que ai n'a pas affiché le journal "onKeyDown".

et l'affichage logcat ceci:

01-05 11:04:38.012: W/KeyCharacterMap(401): No keyboard for id 0 
01-05 11:04:38.012: W/KeyCharacterMap(401): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 

ce que je veux est d'afficher l'ActivityGroup quand mon Activity A est détruit.

NB: mon niveau d'application est 4: * Android 1.6 *, donc je ne peux pasoverridela méthodeonBackPressed()

Merci à tous pour votre aide

----------------------------------- EDIT ------------- ---------------------------

J'ai ajouté le code de mon onKeyDown comme celui-ci sur mon Activity A:

@Override de onKeyDown public boolean (int keyCode, événement KeyEvent) {

if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){ 
     ParentActivity parentActivity = (ParentActivity) this.getParent(); 
     parentActivity.onKeyDown(keyCode, event); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

Et dans mon ParentActivity, j'ai :

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){ 
      Log.i(TAG, "onKeyDown"); 
      int len = idOfSubActivities.size(); 
      String idOfCurrentActivity = idOfSubActivities.get(len-1); 
      Activity currentActivity = getLocalActivityManager().getActivity(idOfCurrentActivity); 
      currentActivity.finish(); 
      idOfSubActivities.remove(len - 1); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

J'ai obtenu le même résultat, la Activity A est arrêté, mais il me donne encore la fenêtre nulle avec e titre e de mon application, et il ne montre pas mon ActivityGroup (ParentActivity)

Répondre

1

Je face à un problème similaire à quand j'ai commencé à expérimenter avec ActivityGroup s. Le problème est que vous devez placer votre onKeyDown() dans votre Activity. Cependant, vous avez besoin du Activity pour avoir une référence au ActivityGroup. Ensuite, lorsque vous appuyez sur retour, appelez le vôtre onBack() dans le ActivityGroup.

(EDIT) Voici un exemple pour vous

Ci-dessous le code ActivityGroup dépouillé qui gère la navigation et de l'histoire dans mes applications. Il a été ajusté à la volée, il pourrait donc y avoir une erreur. Remarquez quelques points plus fins.

public class MyGroup extends ActivityGroup 
{ 
/** Static Reference to this Group. */ 
    static MyGroup instance; 
/** Keeps Track of the History as a Stack. */ 
    private ArrayList<View> myActivityHistory; 

    @Override protected void onCreate(final Bundle savedInstanceState) 
    {//Call the Base Implementation 
     super.onCreate(savedInstanceState); 

    // Initialize the Activity History 
     myActivityHistory = new ArrayList<View>(); 

    // Build the Intent 
     Intent _root = null; 
    //Lists the Applications 
     _root = new Intent(this, MyActivity.class); 
    // Send the Index to the Child Activity 
     _root.setAction(Intent.ACTION_VIEW); 
    // Forward the Extras, if they are there 
    // Start the root Activity within the Group and get its View 
     final View _view = getLocalActivityManager().startActivity("App Preferences", _root).getDecorView(); 
    // Start the History 
     addNewLevel(_view); 
    } 

    /** 
    * Gets the instance of the {@link ApplicationGroup} that the child Activity 
    * belongs to. 
    * 
    * @param index 
    * The Group that was passed to the child in the {@link android.content.Intent 
    * Intent} via an Extra (int). 
    * @return 
    * <b>ApplicationGroup -</b> The group that this child was assigned to. 
    */ 
    static public ApplicationGroup getGroup() 
    { if (instance != null) 
      return instance; 
    } 

    /** 
    * Allows the Child to replace the {@link ApplicationGroup}'s current 
    * {@link android.view.View View} with the specified View. This is 
    * intended to be used specifically by the Child. 
    * 
    * @param withView 
    * The View to use for replacement. 
    */ 
    public void addNewLevel(final View withView) 
    {//Adds the old one to history 
     myActivityHistory.add(withView); 
    // Changes this Groups View to the new View. 
     setContentView(withView); 
    } 

    /** 
    * Takes the specified {@link android.app.ActivityGroup ActivityGroup} back 
    * one step in the History to the previous {@link android.view.View View}. 
    */ 
    public void back() 
    { Log.d("Group", "Back overridden"); 
     //If there are more than one screen 
     if (myActivityHistory.size() > 1) 
     { Log.d("Group", "History called"); 
     // Remove the most recent View 
      myActivityHistory.remove(myActivityHistory.size()-1); 
     // Change the View back. 
      setContentView(myActivityHistory.get(myActivityHistory.size()-1)); 
     } 
    // Otherwise Exit 
     else 
     { Log.d("Group", "Program finished"); 
      finish(); 
     } 
    } 

} 

suivant est le code pertinent pour l'activité:

public boolean onKeyDown(int keyCode, KeyEvent event) 
{//If back was pressed 
    if (keyCode==KeyEvent.KEYCODE_BACK) 
    { MyGroup.getGroup().back(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

Assurez-vous que vous ne définissez pas le KeyDownListener à quoi que ce soit drôle et il devrait fonctionner correctement. :) Les changements que j'ai faits sont parce que je les ai réellement dans une rangée de groupes (3 à la fois). Essentiellement, il suffit de faire du groupe un Singleton pour que vous puissiez toujours avoir la même instance et conserver un tableau de vos Vues pour avoir un Historique. Puis référencez l'historique lorsque vous cliquez sur Précédent ou lorsque vous ajoutez une vue.

Hope this helps, FuzzicalLogic

+0

je vais essayer, merci pour votre réponse :) – Houcine

+0

s'il vous plaît voir mon modifier, je l'ai fait ce que vous me dit et j'obtenu le même résultat, pouvez-vous s'il vous plaît fournir quelques de votre code dont vous avez parlé merci – Houcine

+0

Oui, donnez-moi quelques heures pour l'attraper. (Je suis au travail et l'application que je l'ai utilisé est à la maison) ... –