在 Android 中的活动之间传递数据(对象)列表
Pass list of data (object) between activites in Andriod
我有一个 class Dice
实现 Parcelable
如下所示
import android.os.Parcel;
import android.os.Parcelable;
public class Dice implements Parcelable {
int mDiceNumber;
boolean mDiceClicked = false;
public Dice(int mDiceNumber, boolean diceClicked) {
this.mDiceNumber = mDiceNumber;
mDiceClicked = diceClicked;
}
protected Dice(Parcel in) {
mDiceNumber = in.readInt();
mDiceClicked = in.readByte() != 0;
}
public static final Creator<Dice> CREATOR = new Creator<Dice>() {
@Override
public Dice createFromParcel(Parcel in) {
return new Dice(in);
}
@Override
public Dice[] newArray(int size) {
return new Dice[size];
}
};
public boolean isDiceClicked() {
return mDiceClicked;
}
public void setDiceClicked(boolean diceClicked) {
mDiceClicked = diceClicked;
}
public int getDiceNumber() {
return mDiceNumber;
}
public void setDiceNumber(int diceNumber) {
mDiceNumber = diceNumber;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mDiceNumber);
dest.writeByte((byte) (mDiceClicked ? 1 : 0));
}
}
我还有两个活动,我的 MainActivity
和 SecondActivity
。在 MaiActivity 中,我有一个 class Dice
数组
private Dice[] mDice = new Dice[]{
new Dice(1, false),
new Dice(2, false),
new Dice(3, false),
new Dice(4, false),
new Dice(5, false),
new Dice(6, false)
};
我希望能够将我的整个骰子数组传递给我的 SecondActivity。
这是我到目前为止所做的:
在MainActivity中:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("Dices", mDice);
startActivity(intent);
在 SecondActivity:
Dice mDice[] = getIntent().getParcelableExtra("Dices");
TextView textView = (TextView) findViewById(R.id.Text1);
textView.setText(mDice.getDiceNumber());
但是它崩溃了。我知道如何传递一个对象,它只是一个对象而不是整个数组。但是每当我尝试传递整个数组时它就会崩溃。我也试过
Dice mDice[] = getIntent().getParcelableArrayExtra()("Dices");
//and also with defining my mDice[] as Parcelable like this
Parcelable mDice[] = getIntent().getParcelableArrayExtra()("Dices");
但运气不好。请帮助我!
编辑:
我尝试将 Dice mDice[]
更改为 Parcelable mDice[]
,现在我可以打开第二个 activity 而不会导致应用程序崩溃。但是我无法检索我的值,因为我的 mDice[] 出于某种原因没有方法 mDice[0].getDiceNumber()
和 mDice[0].isDiceClicked()
。
在 SecondActivity:
Parcelable mDice[] = getIntent().getParcelableExtra("Dices");
TextView textView = (TextView) findViewById(R.id.Text1);
textView.setText(mDice[0].getDiceNumber()); // here I get an error saying Cannot resolve method 'getDiceNumber' in 'Parcelable'
下面是问题所在的行;
textView.setText(mDice.getDiceNumber())
一定要像下面这样;
textView.setText(mDice[0].getDiceNumber())
编辑:
为了回答您更新后的问题,
您正在尝试从 Parcelable[] 数组中获取所需的字段。您必须实际将其投射到 Dice 对象。
示例:
Parcelable[] dices =
getIntent().getExtras().getParcelableArray("Dices");
Dices[] newDices = new Dice[dices.length];
for (int i = 0 ; i < dices.length; i++) {
newDices[i] = (Dice)dices[i];
newDices[i].getDiceNumber() // This will give you the result
}
我建议你使用 Gson()。
在您的 FirstActivity 中:
String strDice = new Gson().toJson(listOfStickerObject);
intent.putExtra("Dices", mDice);
>>Get the value From Second Activity:
Gson gson = new Gson();
String strDice = getIntent().getStringExtra("Dices");
Type listType = new TypeToken<List<Dice>>(){}.getType();
List<Dice> dice= gson.fromJson(jsonOutput, listType);
我有一个 class Dice
实现 Parcelable
如下所示
import android.os.Parcel;
import android.os.Parcelable;
public class Dice implements Parcelable {
int mDiceNumber;
boolean mDiceClicked = false;
public Dice(int mDiceNumber, boolean diceClicked) {
this.mDiceNumber = mDiceNumber;
mDiceClicked = diceClicked;
}
protected Dice(Parcel in) {
mDiceNumber = in.readInt();
mDiceClicked = in.readByte() != 0;
}
public static final Creator<Dice> CREATOR = new Creator<Dice>() {
@Override
public Dice createFromParcel(Parcel in) {
return new Dice(in);
}
@Override
public Dice[] newArray(int size) {
return new Dice[size];
}
};
public boolean isDiceClicked() {
return mDiceClicked;
}
public void setDiceClicked(boolean diceClicked) {
mDiceClicked = diceClicked;
}
public int getDiceNumber() {
return mDiceNumber;
}
public void setDiceNumber(int diceNumber) {
mDiceNumber = diceNumber;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mDiceNumber);
dest.writeByte((byte) (mDiceClicked ? 1 : 0));
}
}
我还有两个活动,我的 MainActivity
和 SecondActivity
。在 MaiActivity 中,我有一个 class Dice
private Dice[] mDice = new Dice[]{
new Dice(1, false),
new Dice(2, false),
new Dice(3, false),
new Dice(4, false),
new Dice(5, false),
new Dice(6, false)
};
我希望能够将我的整个骰子数组传递给我的 SecondActivity。
这是我到目前为止所做的:
在MainActivity中:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("Dices", mDice);
startActivity(intent);
在 SecondActivity:
Dice mDice[] = getIntent().getParcelableExtra("Dices");
TextView textView = (TextView) findViewById(R.id.Text1);
textView.setText(mDice.getDiceNumber());
但是它崩溃了。我知道如何传递一个对象,它只是一个对象而不是整个数组。但是每当我尝试传递整个数组时它就会崩溃。我也试过
Dice mDice[] = getIntent().getParcelableArrayExtra()("Dices");
//and also with defining my mDice[] as Parcelable like this
Parcelable mDice[] = getIntent().getParcelableArrayExtra()("Dices");
但运气不好。请帮助我!
编辑:
我尝试将 Dice mDice[]
更改为 Parcelable mDice[]
,现在我可以打开第二个 activity 而不会导致应用程序崩溃。但是我无法检索我的值,因为我的 mDice[] 出于某种原因没有方法 mDice[0].getDiceNumber()
和 mDice[0].isDiceClicked()
。
在 SecondActivity:
Parcelable mDice[] = getIntent().getParcelableExtra("Dices");
TextView textView = (TextView) findViewById(R.id.Text1);
textView.setText(mDice[0].getDiceNumber()); // here I get an error saying Cannot resolve method 'getDiceNumber' in 'Parcelable'
下面是问题所在的行;
textView.setText(mDice.getDiceNumber())
一定要像下面这样;
textView.setText(mDice[0].getDiceNumber())
编辑:
为了回答您更新后的问题,
您正在尝试从 Parcelable[] 数组中获取所需的字段。您必须实际将其投射到 Dice 对象。
示例:
Parcelable[] dices =
getIntent().getExtras().getParcelableArray("Dices");
Dices[] newDices = new Dice[dices.length];
for (int i = 0 ; i < dices.length; i++) {
newDices[i] = (Dice)dices[i];
newDices[i].getDiceNumber() // This will give you the result
}
我建议你使用 Gson()。
在您的 FirstActivity 中:
String strDice = new Gson().toJson(listOfStickerObject);
intent.putExtra("Dices", mDice);
>>Get the value From Second Activity:
Gson gson = new Gson();
String strDice = getIntent().getStringExtra("Dices");
Type listType = new TypeToken<List<Dice>>(){}.getType();
List<Dice> dice= gson.fromJson(jsonOutput, listType);