J'ai cherché quelques sujets mais je n'ai pas trouvé de solution à mon problème.
public class Series implements Parcelable {
private String name;
private int numOfSeason;
private int numOfEpisode;
/** Constructors and Getters/Setters have been removed to make reading easier **/
public Series(Parcel in) {
String[] data = new String[3];
in.readStringArray(data);
this.name = data[0];
this.numOfSeason = Integer.parseInt(data[1]);
this.numOfEpisode = Integer.parseInt(data[2]);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] { this.name,
String.valueOf(this.numOfSeason),
String.valueOf(this.numOfEpisode) });
}
private void readFromParcel(Parcel in) {
name = in.readString();
numOfSeason = in.readInt();
numOfEpisode = in.readInt();
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@Override
public Series createFromParcel(Parcel in) {
return new Series(in);
}
@Override
public Series[] newArray(int size) {
return new Series[size];
}
};
}
Dans ma MainActivity, j'ai une liste de tableaux. Pour rendre la liste modifiable de manière dynamique, je dois la passer à une autre activité où je peux la modifier.
ArrayList<Series> listOfSeries = new ArrayList<Series>();
public void openAddActivity() {
Intent intent = new Intent(this, AddActivity.class);
intent.putParcelableArrayListExtra(
"com.example.episodetracker.listofseries",
(ArrayList<? extends Parcelable>) listOfSeries);
startActivity(intent);
}
Je dois lancer la liste, sinon Eclipse me donne le message d'erreur suivant . La méthode putParcelableArrayListExtra (String, ArrayList) du type Intent ne s'applique pas aux arguments (String, List)
Est-ce la bonne façon de le faire?
ArrayList<Series> list = savedInstanceState
.getParcelableArrayList("com.example.episodetracker.listofseries");
C’est ainsi que j’essaie de lire les données d’une autre activité.
Il s'écrase sur la ligne ci-dessus. à savoir la partie getParcelableArrayList.
Le problème réside dans l'écriture sur le colis et la lecture du colis ...
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(numOfSeason);
dest.writeInt(numOfEpisode);
}
private void readFromParcel(Parcel in) {
name = in.readString();
numOfSeason = in.readInt();
numOfEpisode = in.readInt();
}
Ce que vous écrivez doit correspondre à ce que vous avez lu dans ...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent i = new Intent(this,SecondActivity.class);
ArrayList<testparcel> testing = new ArrayList<testparcel>();
i.putParcelableArrayListExtra("extraextra", testing);
startActivity(i);
}
/**********************************************/
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<testparcel> testing = this.getIntent().getParcelableArrayListExtra("extraextra");
}
}
Le code ci-dessus a onCreate () de deux activités différentes. Le premier lance le second; et cela fonctionne bien j'ai pu tirer le colisable sans problème.
Vous devez utiliser la méthode putParcelableArrayListExtra()
sur la classe Intent
.
J'ai utilisé putParcelableArrayList(<? extends Parcelable>)
à partir d'un objet Bundle
. Pas directement d'un objet d'intention (je ne sais pas vraiment quelle est la différence). mais j'utilise de cette façon:
ArrayList<ParcelableRow> resultSet = new ArrayList<ParcelableRow>();
resultSet = loadData();
Bundle data = new Bundle();
data.putParcelableArrayList("search.resultSet", resultSet);
yourIntent.putExtra("result.content", data);
startActivity(yourIntent);
Plus tard, lors de votre nouvelle activité, vous pourrez renseigner les données récemment insérées sur l’objet Bundle, comme suit:
Bundle data = this.getIntent().getBundleExtra("result.content");
ArrayList<ParcelableRow> result = data.getParcelableArrayList("search.resultset");
Rappelez-vous simplement que votre ArrayList<>
ne doit contenir que des objets pouvant être parcellisés. et juste pour vous assurer que vous avez transmis les données, vous pouvez vérifier si les données reçues sont nulles ou non, simplement pour éviter les problèmes.
Peut-être que cela aide quelqu'un… sinon mon problème était que j'utilisais write et readValue, mais il devait correspondre à un type comme writeInt, readInt writeString, readString, etc.
Je le fais de cette façon:
var intent = Intent(this@McqActivity,ResultActivity::class.Java)
intent.putParcelableArrayListExtra("keyResults", ArrayList(resultList))
// resultList is of type mutableListOf<ResultBO>()
startActivity(intent)
Et pour rendre la classe Parcelable . Je fais simplement two operation
d’abord j’ai utilisé @Parcelize Annotation
au-dessus de ma classe de données et deuxièmement je l’hérite avec Parcelable
comme ci-dessous ..
import kotlinx.Android.parcel.Parcelize
import Android.os.Parcelable
@Parcelize // Include Annotion
data class ResultBO(val questionBO: QuestionBO) : Parcelable {
constructor() : this(QuestionBO())
}
Et à la fin de réception
if (intent != null) {
var results = intent.getParcelableArrayListExtra<Parcelable>("keyResults")
}