2017-11-05 5 views
-1

Ich versuche eine sehr einfache App zu erstellen, die im Grunde die Punkte von 4 Spielern erfasst, die ein Kartenspiel im echten Leben spielen. Meine Idee war es, für jeden Spieler eine Instanz der Klasse "Player" zu erstellen, die bisher nur die Variablen "name" und "score" enthält. Ich folgte den Anweisungen dieses Artikels (http://sohailaziz05.blogspot.de/2012/04/passing-custom-objects-between-android.html) und implementiert Parcel in der „Player“ Klasse:Mehrere Objekte an eine andere Aktivität übergeben

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]; 
     } 
    }; 

} 

Dies ist der Code für die erste Aktivität ist (ich bin nur zu schaffen ein Spieler hier, im Idealfall sollte es 4 oder mehr):

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); 
    }  
} 

Wenn ich eine Schaltfläche in dieser ersten Tätigkeit drücken, „startGame“ wird ausgelöst und Spielernamen und Noten sollen in der zweiten Aktivität gezeigt werden:

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); 
    } 
} 
So

, wenn ich das laufen lasse, erhalte ich die folgende Fehlermeldung in dem Emulator, wenn ich die Taste drücken, um von der ersten in die zweite Aktivität zu erhalten: Spiel aufgehört hat Öffnen App wieder

Was nicht in Ordnung ist ? Ist parcelable der richtige Ansatz oder sollte ich serializable verwenden? Und wie kann ich nicht nur 1, sondern 4 Objekte an die zweite Aktivität übergeben?

Ich würde deine Hilfe schätzen, ich bin wirklich hier fest ... Danke!

+0

Sie rufen 'putExtra' mehr als einmal, wenn Sie mehr als eine Sache weitergeben möchten ... In jedem Fall sollten Sie die logcat bereitstellen –

Antwort

0

Dies ist, wie ich es normalerweise tue.

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"); 
    } 
} 
Verwandte Themen