Mauvais résultat d'une activité (RESULT_CANCELED)
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 :mrgreen: :
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 :
Code:
1 2 3
| Intent intent = new Intent(this, InfoFiche.class);
intent.putExtra(FICHE_SELECTIONNEE, fiche);
startActivityForResult(intent, AFFICHE_FICHE_REQUEST); |
"B" permet d'afficher le contenu de la fiche (une liste d'éléments).
Tant que l'utilisateur reste sur "B", il n'y a aucun soucis, il peut ajouter/supprimer des éléments via
(pour ajouter) :
Code:
1 2
| fiche.addTransaction(t);
adapter.notifyDataSetChanged(); |
(pour supprimer) :
Code:
1 2 3
|
fiche.removeTransaction(indexTransactionSelectionnee);
adapter.notifyDataSetChanged(); |
Le problème survient lorsque je dois passer cette fiche (qui a été modifié) à "A" ...
J'utilise donc onPause() dans "B" pour faire passer mes données :
Code:
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);
} |
et dans "A" :
Code:
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);
}
} |
Le requestCode est bon, en revanche, le resultCode est à RESULT_CANCELED et la data est null.
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 :D
En plus :
"A" alias MainActivity :
Code:
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;
}
} |
"B" alias InfoFiche
Code:
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;
}
} |
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 ! :)