Bonjour,
j'ai un petit soucis lors de la mise en pause d'une de mes activités, j'ai cherché un peu partout mais je n'arrive pas à mettre la main sur une solution satisfaisante à mon problème, je vous en fait donc part :
J'ai deux activités ("A" et "B") qui rentrent en jeu, "B" est démarrée par "A" et lui envoie des données. Le problème c'est que dans certains cas, le resultat de "B" passe en RESULT_CANCELED alors que je lui indique bien que son résultat est RESULT_OK...
Pour expliquer un peu les cas ou ça se produit :
"A" possède une ListView d'éléments (des fiches). Quand l'utilisateur clique sur une fiche, "B" est appelé pour afficher les détails de la fiche :
"B" permet d'afficher le contenu de la fiche (une liste d'éléments).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Intent intent = new Intent(this, InfoFiche.class); intent.putExtra(FICHE_SELECTIONNEE, fiche); startActivityForResult(intent, AFFICHE_FICHE_REQUEST);
Tant que l'utilisateur reste sur "B", il n'y a aucun soucis, il peut ajouter/supprimer des éléments via
(pour ajouter) :
(pour supprimer) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 fiche.addTransaction(t); adapter.notifyDataSetChanged();
Le problème survient lorsque je dois passer cette fiche (qui a été modifié) à "A" ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 fiche.removeTransaction(indexTransactionSelectionnee); adapter.notifyDataSetChanged();
J'utilise donc onPause() dans "B" pour faire passer mes données :
et dans "A" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 @Override public void onPause(){ super.onPause(); Intent intent = new Intent(); intent.putExtra(MainActivity.FICHE_SELECTIONNEE, fiche); setResult(RESULT_OK, intent); }
Le requestCode est bon, en revanche, le resultCode est à RESULT_CANCELED et la data est null.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ if(requestCode == AFFICHE_FICHE_REQUEST && resultCode == RESULT_OK){ FicheTransactions fiche = (FicheTransactions) data.getSerializableExtra(FICHE_SELECTIONNEE); donnees.getFichesTransactions().set(indexFicheSelectionnee, fiche); } }
J'ai vérifié avec le debugger, et ma méthode onPause fait bien son boulot (le mResult de "B" passe bien en RESULT_OK mais change après)
Le pire, c'est que ça survient seulement lorsque l'utilisateur n'a pas ajouté d'élément à la fiche.
(Si il rajoute un élément, ça fonctionne. Si il retire un élément, ça ne fonctionne pas. Si il rajoute et supprime un élément (différent ou non et dans n'importe quel ordre), ça fonctionne.
Quelqu'un aurait une idée de comment procédé pour résoudre proprement mon problème ?
Ne sachant pas vraiment où regarder, j'ai un peu mis ce que je pouvais en vrac, mais je serais très heureux de vous donner des informations complémentaires
En plus :
"A" alias MainActivity :
"B" alias InfoFiche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 package fr.binou.alphaloan.activites; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import fr.binou.alphaloan.R; import fr.binou.alphaloan.interfaces.ListViewFiches; import fr.binou.alphaloan.modeles.Application; import fr.binou.alphaloan.modeles.ExceptionRadin; import fr.binou.alphaloan.modeles.FicheTransactions; public class MainActivity extends ActionBarActivity implements OnItemClickListener, OnItemLongClickListener { private final String DATA_FILE = "data.bn"; private static final int AFFICHE_FICHE_REQUEST = 1; private final int AJOUT_FICHE_REQUEST = 2; public static final String FICHE_SELECTIONNEE = "FICHE_SELECTIONNEE"; public static final String NOUVELLE_FICHE = "NOUVELLE_FICHE"; private Application donnees; private ListView listeFiche; private ListViewFiches adapter; private int indexFicheSelectionnee; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ObjectInputStream in; try{ in = new ObjectInputStream(openFileInput(DATA_FILE)); donnees = (Application) in.readObject(); in.close(); } catch (Exception e) { donnees = new Application(); } listeFiche = (ListView) findViewById(R.id.listeFiche); listeFiche.setOnItemClickListener(this); listeFiche.setOnItemLongClickListener(this); adapter = new ListViewFiches(this, donnees.getFichesTransactions()); listeFiche.setAdapter(adapter); } @Override public void onStop(){ super.onStop(); ObjectOutputStream out; try{ out = new ObjectOutputStream(openFileOutput(DATA_FILE, Context.MODE_PRIVATE)); out.writeObject(donnees); out.close(); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu){ MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_infofiche, menu); menu.getItem(0).setTitle("Nouvelle Fiche"); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()){ case R.id.action_addTransaction: Intent intent = new Intent(this, AjoutFiche.class); startActivityForResult(intent, AJOUT_FICHE_REQUEST); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onItemClick(AdapterView<?> adapt, View view, int position, long id) { indexFicheSelectionnee = position; FicheTransactions fiche = (FicheTransactions) adapt.getItemAtPosition(position); Intent intent = new Intent(this, InfoFiche.class); intent.putExtra(FICHE_SELECTIONNEE, fiche); startActivityForResult(intent, AFFICHE_FICHE_REQUEST); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ if(requestCode == AFFICHE_FICHE_REQUEST && resultCode == RESULT_OK){ FicheTransactions fiche = (FicheTransactions) data.getSerializableExtra(FICHE_SELECTIONNEE); donnees.getFichesTransactions().set(indexFicheSelectionnee, fiche); } else if(requestCode == AJOUT_FICHE_REQUEST && resultCode == RESULT_OK){ FicheTransactions fiche = (FicheTransactions) data.getSerializableExtra(NOUVELLE_FICHE); try { donnees.addFicheTransactions(fiche); } catch (ExceptionRadin e) { e.printStackTrace(); } } adapter.notifyDataSetChanged(); } @Override public boolean onItemLongClick(AdapterView<?> adapt, View view, int position, long id) { indexFicheSelectionnee = position; AlertDialog.Builder adb = new AlertDialog.Builder(this); adb.create(); adb.setTitle(donnees.getFicheTransactions(indexFicheSelectionnee).getContact().getPseudo()); adb.setMessage("Supprimer la fiche ?"); adb.setPositiveButton("Oui", new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub donnees.removeFicheTransactions(donnees.getFicheTransactions(indexFicheSelectionnee)); adapter.notifyDataSetChanged(); } }); adb.setNegativeButton("Non", null); adb.show(); return false; } }
Voila voila, merci beaucoup pour ceux qui auront pris le temps de lire, et merci beaucoup (encore plus) pour ceux qui prendront le temps de répondre !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 package fr.binou.alphaloan.activites; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import fr.binou.alphaloan.R; import fr.binou.alphaloan.interfaces.ListViewTransactions; import fr.binou.alphaloan.modeles.FicheTransactions; import fr.binou.alphaloan.modeles.Transaction; public class InfoFiche extends ActionBarActivity implements OnItemLongClickListener{ private final int AJOUT_TRANSACTION_REQUEST = 1; public final static String NOUVELLE_TRANSACTION = "NOUVELLE_TRANSACTION"; private FicheTransactions fiche; private int indexTransactionSelectionnee; private ListView listeTransactions; private ListViewTransactions adapter; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.info_fiche); fiche = (FicheTransactions) getIntent().getSerializableExtra(MainActivity.FICHE_SELECTIONNEE); listeTransactions = (ListView) findViewById(R.id.listeTransaction); adapter = new ListViewTransactions(this, fiche.getTransactions()); listeTransactions.setAdapter(adapter); listeTransactions.setOnItemLongClickListener(this); } @Override public void onPause(){ super.onPause(); Intent intent = new Intent(); intent.putExtra(MainActivity.FICHE_SELECTIONNEE, fiche); setResult(RESULT_OK, intent); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ if(requestCode == AJOUT_TRANSACTION_REQUEST && resultCode == RESULT_OK){ Transaction t = (Transaction) data.getSerializableExtra(NOUVELLE_TRANSACTION); fiche.addTransaction(t); adapter.notifyDataSetChanged(); } } @Override public boolean onCreateOptionsMenu(Menu menu){ MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_infofiche, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()){ case R.id.action_addTransaction: Intent intent = new Intent(this, AjoutTransaction.class); startActivityForResult(intent, AJOUT_TRANSACTION_REQUEST); return true; default: return super.onOptionsItemSelected(item); } } @Override public boolean onItemLongClick(AdapterView<?> adapt, View view, int position, long id) { indexTransactionSelectionnee = position; AlertDialog.Builder adb = new AlertDialog.Builder(this); adb.create(); adb.setTitle(fiche.getTransactions().get(indexTransactionSelectionnee).getLabel()); adb.setMessage("Supprimer la transaction ?"); adb.setPositiveButton("Oui", new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub fiche.removeTransaction(indexTransactionSelectionnee); adapter.notifyDataSetChanged(); } }); adb.setNegativeButton("Non", null); adb.show(); return false; } }
Partager