2010-06-15 9 views
2

Je voudrais savoir comment gérer l'intention entre les onglets. Par exemple, j'ai une activité d'onglet avec deux onglets. Le premier sur le contenu est une vue de texte. un autre est une vue de la carte. Lorsque je clique sur cette vue de texte, elle redirige vers l'onglet2. cela peut être facilement réalisé par les méthodes setCurrentTab (1) ou setCurrentTabByTag ("tab2"). Mais je veux transmettre des valeurs lat et longues à cette activité de carte pour faire tomber l'épingle. Quelle est la meilleure façon d'utiliser les intentions ou getter/setter dans Java? Que préfères-tu? si votre réponse est "Intents". Comment?Comment utiliser l'intention entre les onglets de Java/Android?

+1

Comment sont définis vos onglets? Sont-ils des vues intégrées ou des activités différentes? – Pentium10

+0

J'ai utilisé différentes activités. – Praveen

Répondre

4

Un problème intéressant. Je comprends que vous voulez passer au deuxième onglet sur un clic dans le premier onglet, mais aussi transmettre des données spéciales au second onglet qui dépend de l'action dans le premier onglet.

Je commence généralement vos vues dans les onglets avec une activité. Cependant, ceci est fait au moment où l'hôte de l'onglet est configuré. Cela signifie que les deux intentions sont celles de l'activité qui permet à l'utilisateur de choisir lat long et celle qui montre lat long sont ouvertes en même temps.

Par conséquent, vous ne pouvez pas ajouter les informations à l'intention utilisée pour initialiser l'hôte de l'onglet. Je n'aime pas la solution mais la seule chose qui me vient à l'esprit (en utilisant différentes activités pour les onglets) est l'utilisation d'un application personnalisé qui stocke une référence à un objet contenant les données dont vous avez besoin pour mettre à jour la vue languette. Vous devez étendre l'application avec une classe propre et ajouter cette classe dans votre manifeste, maintenant vous pouvez appeler getApplication dans le premier onglet, le transtyper dans votre classe d'application set lat et long juste avant d'appeler setCurrentTab. Dans le deuxième onglet, vous pouvez appeler à nouveau getApplication() et vous obtiendrez alors l'objet application qui est le même pour chaque activité à chaque moment de votre application en cours d'exécution. Vous l'avez ensuite renvoyé à votre objet d'application et récupérez la valeur lat et la valeur longue. Voir ce page dans les reflexions google sur la façon d'utiliser une classe d'application personnalisée.

Pour utiliser une classe d'application personnalisée ajouter ce qui suit à votre balise d'application dans votre manifeste:

<application 
    ... 
    android:name=".somepackage.CustomAppClass" 

Cela indiquera Android instancier la CustomAppClass que votre classe d'application au moment de votre application commence. Vous devez étendre l'application pour éviter les erreurs au démarrage.

Une autre solution mais pas celle que je préférerais est d'initialiser les vues vous-même et d'initialiser le tabhost avec des vues et non des activités. Avec une vue de carte dans l'un des onglets cela pourrait être très lourd en mémoire.

+0

vous m'a beaucoup dérouté. J'utilise différentes activités pour les onglets. quand je clique sur une vue sur l'onglet1. il redirige vers cette activité de carte (deuxième onglet). La principale chose que je suis obtenir cette latitude et la longitude de tab1. cette valeur change dynamiquement. – Praveen

+1

C'est le problème que vous ne pouvez pas utiliser dans ce cas parce que l'intention de démarrer l'activité de la carte est envoyée au moment de l'initialisation de l'onglet. cela signifie que vous ne pouvez pas y attacher de données plus tard. Vous devez avoir une variable globale accessible pour les deux activités qui contient les valeurs longues lat J'édite mon post, c'est encore assez compliqué mais peut-être pas plus déroutant. J'essaie de trouver un tutoriel pour travailler avec des classes d'application personnalisées. – Janusz

+0

alors je veux utiliser les méthodes getter/setter. droite? – Praveen

1

Si vous voulez transmettre des valeurs entre les activités, je vous suggère de regarder

http://developer.android.com/reference/android/content/SharedPreferences.html

la meilleure façon d'obtenir des valeurs d'une itent à l'autre. Avec sharedPrefrences, il existe une seule instance de la classe pour l'ensemble de l'application, ce qui signifie que vous pouvez stocker des valeurs dans les fichiers, changer d'objet ou d'activité, puis rappeler les fichiers SharedPrefrence contenant les données. Le seul inconvénient est que vous devez passer des types primitifs (int, string, boolean) mais je suis sûr que vous trouverez des façons de contourner cela :).

0

Si vous faites l'intention que vous utilisez pour démarrer l'activité du deuxième onglet une intention globale.

Vous pouvez ensuite ajouter des suppléments à cette intention dans le onPause() du premier onglet.Remarque: vous devez définir tous vos onglets dans des activités distinctes de votre tabhost TabActivity car l'activité onPause() de cette activité n'est jamais appelée.

Cela aussi aider de la réponse ci-dessus, si vous utilisez une variable globale enregistrée dans votre activité qui étend l'application, vous pouvez le configurer dans le onPause() comme il est tiré avant l'activité est en marche, que vous trouverez peut-être un problème si la définition de cette ailleurs

1

Je ne vois pas le problème ici: Peut-être est un peu de hackish, mais le code suivant fonctionne pour moi:

public boolean onClick(View v) { 
    //get your data you wanna send. 
    //If it is an Object it would be good if it is Parcelable 
    Object o = getYourData(); 
    // or Parcelable p = getYourData 
    Activity activity = getParent(); 
    //I'm assuming were inside an Activity which is started by TabActivity 
    if (activity instanceof TabActivity){ 
     TabActivity ta = (TabActivity)activity; 
     //now determine the Tab you wanna start 
     ta.getTabHost().setCurrentTabByTag("yourTag"); 
     //or ta.getTabHost().setCurrentTab(yourID); 
     Activity current = ta.getCurrentActivity(); 
     //check if the Activity is the one you wanna start 
     if (current instanceof YOUR_ACTIVITY_YOU_WANNA_START){ 
      //Cast to your Activity 
      YOUR_ACTIVITY_YOU_WANNA_START yourActivity = 
        (YOUR_ACTIVITY_YOU_WANNA_START)current; 
      // you only need to put Data inside your Intent 
      Intent intent = new Intent(); 
      intent.putExtra("EXTRA_DATA_TAG", o); 
      //your Activity must Override onNewIntent and make it public, 
      //or simply add another method 
      //with whatever You like as parameter 
      yourActivity.onNewIntent(intent); 
      return true; 
     } 
    } 
    return false; 
} 

cette façon, vous ne devez pas salir avec application , SharedPrefs ou autre trucs essesary mentionnés ici

Questions connexes