将多个对象传递给另一个 activity
Passing multiple objects to another activity
我正在尝试创建一个非常基本的应用程序,基本上可以跟踪现实生活中玩纸牌游戏的 4 位玩家的分数。我的想法是为每个玩家创建一个 class "Player" 的实例,它现在只包含变量 "name" 和 "score"。我按照本文 (http://sohailaziz05.blogspot.de/2012/04/passing-custom-objects-between-android.html) 的说明在 "Player" class:
中实现了 Parcelable
public class Player implements Parcelable {
private String name;
private int score;
public Player(String name, int score) {
this.name = name;
this.score = score;
}
public String getPlayerName() {
return name;
}
public int getPlayerScore() {
return score;
}
public Player(Parcel in) {
String[] data = new String[2];
in.readStringArray(data);
this.name = data[0];
this.score = Integer.parseInt(data[1]);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[]{this.name, String.valueOf(this.score)});
}
public static final Parcelable.Creator<Player> CREATOR = new Parcelable.Creator<Player>() {
@Override
public Player createFromParcel(Parcel source) {
return new Player(source); //using parcelable constructor
}
@Override
public Player[] newArray(int size) {
return new Player[size];
}
};
}
这是第一个activity的代码(我这里只创建一个播放器,理想情况下应该是4个或更多):
public class CreatePlayersScreen extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_players_screen);
}
public void startGame(View view) {
EditText editText1 = (EditText) findViewById(R.id.editText1);
String namePlayer1 = editText1.getText().toString();
int scorePlayer1=0;
Player player1 = new Player(namePlayer1, scorePlayer1);
Intent intent=new Intent(this,ScoreScreen.class);
intent.putExtra("EXTRA_PLAYER_1",player1);
startActivity(intent);
}
}
当我在第一个 activity 中按下按钮时, "startGame" 将被触发,玩家姓名和分数应该显示在第二个 activity:
public class ScoreScreen extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_score_screen);
Player player1= getIntent().getParcelableExtra("EXTRA_PLAYER_1");
String namePlayer1 = player1.getPlayerName();
TextView textView1 = (TextView) findViewById(R.id.textView1);
textView1.setText(namePlayer1);
int scorePlayer1 = player1.getPlayerScore();
TextView textView5 = (TextView) findViewById(R.id.textView5);
textView5.setText(scorePlayer1);
}
}
因此,当我 运行 执行此操作时,一旦我按下按钮从第一个 activity 转到第二个 activity,我就会在模拟器中收到以下错误消息:
游戏已停止
再次打开应用程序
出了什么问题? parcelable 是正确的方法还是我应该使用 serializable?我怎样才能不仅将 1 个对象,而且将 4 个对象传递给第二个活动?
非常感谢你的帮助,我真的被困在这里...谢谢!
这是我通常的做法。
public void startGame(View view) {
EditText editText1 = (EditText) findViewById(R.id.editText1);
String namePlayer1 = editText1.getText().toString();
int scorePlayer1 = 0;
Player player1 = new Player(namePlayer1, scorePlayer1);
EditText editText2 = (EditText) findViewById(R.id.editText2);
String namePlayer2 = editText2.getText().toString();
int scorePlayer2 = 0;
Player player2 = new Player(namePlayer2, scorePlayer2);
Intent intent = new Intent(this, ScoreScreen.class);
Bundle bundle = new Bundle();
bundle.putParcelable("EXTRA_PLAYER_1", player1);
bundle.putParcelable("EXTRA_PLAYER_2", player2);
intent.putExtras(bundle);
startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
Player player1;
Player player2;
if (getIntent().getExtras() != null) {
player1 = getIntent().getExtras().getParcelable("EXTRA_PLAYER_1");
player2 = getIntent().getExtras().getParcelable("EXTRA_PLAYER_2");
}
}
我正在尝试创建一个非常基本的应用程序,基本上可以跟踪现实生活中玩纸牌游戏的 4 位玩家的分数。我的想法是为每个玩家创建一个 class "Player" 的实例,它现在只包含变量 "name" 和 "score"。我按照本文 (http://sohailaziz05.blogspot.de/2012/04/passing-custom-objects-between-android.html) 的说明在 "Player" class:
中实现了 Parcelablepublic class Player implements Parcelable {
private String name;
private int score;
public Player(String name, int score) {
this.name = name;
this.score = score;
}
public String getPlayerName() {
return name;
}
public int getPlayerScore() {
return score;
}
public Player(Parcel in) {
String[] data = new String[2];
in.readStringArray(data);
this.name = data[0];
this.score = Integer.parseInt(data[1]);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[]{this.name, String.valueOf(this.score)});
}
public static final Parcelable.Creator<Player> CREATOR = new Parcelable.Creator<Player>() {
@Override
public Player createFromParcel(Parcel source) {
return new Player(source); //using parcelable constructor
}
@Override
public Player[] newArray(int size) {
return new Player[size];
}
};
}
这是第一个activity的代码(我这里只创建一个播放器,理想情况下应该是4个或更多):
public class CreatePlayersScreen extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_players_screen);
}
public void startGame(View view) {
EditText editText1 = (EditText) findViewById(R.id.editText1);
String namePlayer1 = editText1.getText().toString();
int scorePlayer1=0;
Player player1 = new Player(namePlayer1, scorePlayer1);
Intent intent=new Intent(this,ScoreScreen.class);
intent.putExtra("EXTRA_PLAYER_1",player1);
startActivity(intent);
}
}
当我在第一个 activity 中按下按钮时, "startGame" 将被触发,玩家姓名和分数应该显示在第二个 activity:
public class ScoreScreen extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_score_screen);
Player player1= getIntent().getParcelableExtra("EXTRA_PLAYER_1");
String namePlayer1 = player1.getPlayerName();
TextView textView1 = (TextView) findViewById(R.id.textView1);
textView1.setText(namePlayer1);
int scorePlayer1 = player1.getPlayerScore();
TextView textView5 = (TextView) findViewById(R.id.textView5);
textView5.setText(scorePlayer1);
}
}
因此,当我 运行 执行此操作时,一旦我按下按钮从第一个 activity 转到第二个 activity,我就会在模拟器中收到以下错误消息: 游戏已停止 再次打开应用程序
出了什么问题? parcelable 是正确的方法还是我应该使用 serializable?我怎样才能不仅将 1 个对象,而且将 4 个对象传递给第二个活动?
非常感谢你的帮助,我真的被困在这里...谢谢!
这是我通常的做法。
public void startGame(View view) {
EditText editText1 = (EditText) findViewById(R.id.editText1);
String namePlayer1 = editText1.getText().toString();
int scorePlayer1 = 0;
Player player1 = new Player(namePlayer1, scorePlayer1);
EditText editText2 = (EditText) findViewById(R.id.editText2);
String namePlayer2 = editText2.getText().toString();
int scorePlayer2 = 0;
Player player2 = new Player(namePlayer2, scorePlayer2);
Intent intent = new Intent(this, ScoreScreen.class);
Bundle bundle = new Bundle();
bundle.putParcelable("EXTRA_PLAYER_1", player1);
bundle.putParcelable("EXTRA_PLAYER_2", player2);
intent.putExtras(bundle);
startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
Player player1;
Player player2;
if (getIntent().getExtras() != null) {
player1 = getIntent().getExtras().getParcelable("EXTRA_PLAYER_1");
player2 = getIntent().getExtras().getParcelable("EXTRA_PLAYER_2");
}
}