将 Parcelable 与按钮结合使用时出现的问题
Problems when using Parcelable in connection with buttons
我正在编写一个简单的应用程序,您可以在其中初始化自定义 class "Player" 的实例,然后通过 parcelable 将这些对象传递给下一个 activity。到目前为止一切正常,但是我完全重写了按钮的代码(我之前使用了不同的方法)。现在,如果我不声明 Player 实例为 final,我会得到一个错误。当我将鼠标悬停在 "player 1" 上时,例如这一行:
bundle.putParcelable("EXTRA_PLAYER_1", player1);
它说 "Variable 'player 1' is accessed from within inner class, needs to be declared final"。
这是 "onCreate" 方法的相关部分:
etPlayer4 = (EditText) findViewById(R.id.etPlayer4);
String namePlayer4 = etPlayer4.getText().toString();
Player player4 = new Player();
player4.setPlayerName(namePlayer4);
player4.setPlayerScore(0);
btnStartGame = (Button) findViewById(R.id.btnStartGame);
btnStartGame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(CreatePlayersScreen.this,ScoreScreen.class);
Bundle bundle = new Bundle();
bundle.putParcelable("EXTRA_PLAYER_1", player1);
bundle.putParcelable("EXTRA_PLAYER_2", player2);
bundle.putParcelable("EXTRA_PLAYER_3", player3);
bundle.putParcelable("EXTRA_PLAYER_4", player4);
intent.putExtras(bundle);
startActivity(intent);
}
});
如何避免将 Player 实例声明为最终实例?谢谢!
在 onCreate 之外定义您的播放器对象,以便您可以在 class 的任何地方使用它们。您仍然可以在 oncreate
中为它们分配值
// define
Player player4 , player3,
player2, player1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
etPlayer4 = (EditText) findViewById(R.id.etPlayer4);
String namePlayer4 = etPlayer4.getText().toString();
// assign
player4 = new Player();
player4.setPlayerName(namePlayer4);
player4.setPlayerScore(0);
btnStartGame = (Button) findViewById(R.id.btnStartGame);
btnStartGame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(CreatePlayersScreen.this,ScoreScreen.class);
Bundle bundle = new Bundle();
bundle.putParcelable("EXTRA_PLAYER_1", player1);
bundle.putParcelable("EXTRA_PLAYER_2", player2);
bundle.putParcelable("EXTRA_PLAYER_3", player3);
bundle.putParcelable("EXTRA_PLAYER_4", player4);
intent.putExtras(bundle);
startActivity(intent);
}
});
}
我正在编写一个简单的应用程序,您可以在其中初始化自定义 class "Player" 的实例,然后通过 parcelable 将这些对象传递给下一个 activity。到目前为止一切正常,但是我完全重写了按钮的代码(我之前使用了不同的方法)。现在,如果我不声明 Player 实例为 final,我会得到一个错误。当我将鼠标悬停在 "player 1" 上时,例如这一行:
bundle.putParcelable("EXTRA_PLAYER_1", player1);
它说 "Variable 'player 1' is accessed from within inner class, needs to be declared final"。 这是 "onCreate" 方法的相关部分:
etPlayer4 = (EditText) findViewById(R.id.etPlayer4);
String namePlayer4 = etPlayer4.getText().toString();
Player player4 = new Player();
player4.setPlayerName(namePlayer4);
player4.setPlayerScore(0);
btnStartGame = (Button) findViewById(R.id.btnStartGame);
btnStartGame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(CreatePlayersScreen.this,ScoreScreen.class);
Bundle bundle = new Bundle();
bundle.putParcelable("EXTRA_PLAYER_1", player1);
bundle.putParcelable("EXTRA_PLAYER_2", player2);
bundle.putParcelable("EXTRA_PLAYER_3", player3);
bundle.putParcelable("EXTRA_PLAYER_4", player4);
intent.putExtras(bundle);
startActivity(intent);
}
});
如何避免将 Player 实例声明为最终实例?谢谢!
在 onCreate 之外定义您的播放器对象,以便您可以在 class 的任何地方使用它们。您仍然可以在 oncreate
中为它们分配值// define
Player player4 , player3,
player2, player1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
etPlayer4 = (EditText) findViewById(R.id.etPlayer4);
String namePlayer4 = etPlayer4.getText().toString();
// assign
player4 = new Player();
player4.setPlayerName(namePlayer4);
player4.setPlayerScore(0);
btnStartGame = (Button) findViewById(R.id.btnStartGame);
btnStartGame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(CreatePlayersScreen.this,ScoreScreen.class);
Bundle bundle = new Bundle();
bundle.putParcelable("EXTRA_PLAYER_1", player1);
bundle.putParcelable("EXTRA_PLAYER_2", player2);
bundle.putParcelable("EXTRA_PLAYER_3", player3);
bundle.putParcelable("EXTRA_PLAYER_4", player4);
intent.putExtras(bundle);
startActivity(intent);
}
});
}