2010-06-05 5 views
2

Je ne suis pas très clair sur l'objet Intent et comment l'utiliser pour transmettre des données entre les activités. Dans mon application j'ai plusieurs onglets entre lesquels je veux passer ArrayList. Voici un exemple de code que je prévois d'utiliser, mais il me manque la partie où l'activité principale attrape l'intention et la passe à la nouvelle activité au démarrage:Passage ArrayList <String> entre les onglets

1. myTabs.java ==> Ceci est où je pense que je dois ajouter du code pour transmettre les données entre TabOne et TabTwo. Pour l'instant, il utilise simplement l'exemple de code de l'exemple TabActivity.

public class myTabs extends TabActivity { 
    /** Called when the activity is first created. */ 
    @Override 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Resources res = getResources(); // Resource object to get Drawables 
     TabHost tabHost = getTabHost(); // The activity TabHost 
     TabHost.TabSpec spec; // Reusable TabSpec for each tab 
     Intent intent; // Reusable Intent for each tab 

     // Create an Intent to launch an Activity for the tab (to be reused) 
     intent = new Intent().setClass(this, TabPeopleActivity.class); 
     // Initialize a TabSpec for each tab and add it to the TabHost 
     spec = tabHost.newTabSpec("TabOne").setIndicator("TabOne", 
          res.getDrawable(R.drawable.ic_tab_one)) 
         .setContent(intent); 
     tabHost.addTab(spec); 

     // Do the same for the other tabs 
     intent = new Intent().setClass(this, TabTransactionActivity.class); 
     spec = tabHost.newTabSpec("TabTwo").setIndicator("TabTwo", 
          res.getDrawable(R.drawable.ic_tab_two)) 
         .setContent(intent); 
     tabHost.addTab(spec); 

     tabHost.setCurrentTab(0); 
    } 
} 

2. TabOne.java ==> J'ai ajouté un morceau de code dans la procédure onStop pour remplir les données d'intention avec le tableau que je veux passer à TabTwo. Je ne suis pas sûr que ce soit la bonne façon de le faire.

public class TabOne extends Activity { 

    [...] 
    private ArrayList<String> arrayPeople; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tabone); 
     arrayPeople = new ArrayList<String>(); 

    [... here we modify arrayPeople ...] 

    } 

    /** Called when the activity looses focus **/ 
    @Override 
    public void onStop(){ 
     Intent myIntent = new Intent(); 
     myIntent.putStringArrayListExtra("arrayPeople", arrayPeople); 
     this.setIntent(myIntent); 
    } 
} 

3. TabTwo.java ==> Ici, je suis en train de chercher le ArrayList de l'intention qui est censé être passé quand l'activité commence. Mais comment faire cela?

public class TabTwo extends Activity { 

    private ArrayList<String> arrayPeople; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.transaction); 

     Intent myIntent = new Intent(); 
     myIntent = this.getIntent(); 
     arrayPeople = myIntent.getStringArrayListExtra("arrayPeople"); 
    } 
} 

Merci pour vos idées!

EDIT:

D'accord, je vais faire simple, voici l'espace de travail complet du projet:

http://www.lecompteestbon.com/Android.LCEB.zip

Ce que je veux faire est une version hors ligne du site lecompteestbon, qui permet aux gens de faire la comptabilité entre amis après un week-end.

TabPeople = Add the list of friends 
TabTransactions = List of expenses 
TabTransaction = Add an expense 
TabResult = Calculate the list of payments 

Laissez-moi savoir comment faire ce travail :)

Répondre

0

Je ne pense pas l'intention de modifier dans onStop() fonctionnera parce que le TabHost gère les intentions. Définir une intention de classe avec this.setIntent() ne permet pas à une autre classe d'y accéder avec getIntent() car ils sont construits sur des intentions différentes.

Je stockerais mon arrayPeople dans une base de données ou je transmettrais arrayPeople au TabHost avec MyTabs.setArrayPeople ou quelque chose de similaire. Ensuite, vous pouvez interroger la db onCreate de votre prochain onglet ou simplement le retirer de votre classe MyTabs.

+0

En utilisant une base de données semble trop avancée pour cette chose simple. Quand vous voulez dire "MyTabs.setArrayPeople" est-ce une solution similaire à celle proposée ci-dessus? – Christophe

+0

Oui, l'utilisation d'une ArrayList statique serait la meilleure. – m6tt

2

En quoi consiste la définition d'un champ statique dans l'objet myTabs?

public class myTabs extends TabActivity { 
.... 
public static arrayPeople = new ArrayList<String>(); 
.... 

Sur TabOne.java:

@Override 
    public void onStop(){ 
     myTabs.arrayPeople = arrayPeople; 
    } 

Sur TabTwo.java:

arrayPeople = myTabs.arrayPeople 

est logique?

+0

Il semble simple et intéressant, mais il me donne un "(Suspended (exception RuntimeException))" quand j'essaie de regarder dans le contenu. Je reçois seulement [IMPRIMER]: System.out.println ("arrayPeople [PRINT]"); System.out.println ("arrayPeople 1 = [" + arrayPeople.get (0) + "]"); System.out.println ("arrayPeople [PRINT OK]"); Tout ce que je fais mal? – Christophe

+0

Vous devriez publier votre code. Modifiez votre question et ajoutez le nouveau morceau de code :) –

+0

Ok, voir les détails que j'ai ajoutés avec l'espace de travail complet pour le téléchargement – Christophe

2

Avec les exemples ci-dessus, il a été vraiment travailler quand je remplace le « onStop » = « OnPause »

/** Called when the activity looses focus **/ 
@Override public void onStop() 
{ 
    Intent myIntent = new Intent(); 
    myIntent.putStringArrayListExtra("arrayPeople", arrayPeople); 
    this.setIntent(myIntent); 
} 

/** Called when the activity looses focus **/ 
@Override public void onPause() 
{ 
    Intent myIntent = new Intent(); 
    myIntent.putStringArrayListExtra("arrayPeople", arrayPeople); 
    this.setIntent(myIntent); 
} 
Questions connexes