2012-04-07 13 views
2

Ich bin ein Anfänger Programmierer und ich versuche, Android-Codierung mit Eclipse zu lernen. Dies ist mein erstes Mal mit StackOverflow.Android ArrayList, unerwartet gestoppt

Nur für Tutorialzwecke möchte ich eine einfache Animal Encyclopedia machen.

Also in meiner Heimat Klasse gibt es einige Tasten: "Hund", "Katze", "Vogel", etc. Wenn ich den Knopf klicke, bringt es mich zum gleichen Layout aber natürlich mit anderen Inhalt.

  • Also habe ich eine Klasse namens AnimalData, dass die ArrayList<Integer> hält R.drawable.xxx zu speichern und ArrayList<String> den Text zu speichern, die ich unter dem Bild gesetzt wird (wie „Bulldog“ oder „Husky“)

  • Dann habe ich eine Klasse namens ChangeContent all jene ziehbar und Text in die XML zu setzen

  • Aber immer, wenn ich auf die Schaltfläche klicken, kommt es zu Gestoppt Fehler unerwartet

Unten die verkürzte Startseite Klasse, Der "Crash-maker" ist hier nicht. Ich habe die gesamte Codezeile pro Zeile mit Thread.sleep(2000) überprüft, wenn also meine App vor 2 Sekunden abstürzt, liegt der Fehler vor dem sleep() Code und umgekehrt.

public class Home extends Activity implements OnClickListener{ 
    Button dog, cat, bird; 
    AnimalData ad; 
    ChangeContent cc; 

    private ArrayList<Integer> drawable; 
    private ArrayList<String> title; 

public Home(){ 
    ad = new AnimalData(); 
    cc = new ChangeContent(ad); 
    drawable = new ArrayList<Integer>(); 
    title = new ArrayList<String>() 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 
    //set the findViewById for all the buttons 
    //set onClickListener() to all the buttons 
} 

public void onClick(View v) { 
    switch (v.getId()){ 
    case R.id.bDog: 
     drawable.add(R.drawable.xxx); 
     drawable.add(R.drawable.yyy); 
     title.add("Bulldog"); 
     title.add("Husky"); 
     break; 
    case R.id.Cat: 
     //same 
     break; 
    case R.id.bBird: 
     //same 
     break; 
    } 
    ad.setDrawable(drawable); 
    ad.setTitle(title); 
    Intent i = new Intent("animal.ChangeContent"); //from Manifest 
    startActivity(i); 
} 
} 

Die AnimalData ist nur ein typischer Getter Setter, also werde ich überspringen nur den Code für das

Der Fehler rechts ist nach ChangeContent gestartet, denn selbst wenn ich den Schlaf versetzt() auf der ersten Konstruktorlinie hat keine Auswirkung.

public class ChangeContent extends Activity { 

    TextView title1, title2; 
    ImageView pic1, pic2; 
    private ArrayList<Integer> drawable; 
    private ArrayList<String> title; 

public ChangeContent(AnimalData data){ 
    drawable = new ArrayList<Integer>(); 
    title = new ArrayList<String>(); 
    drawable = data.getDrawable(); 
    title = data.getTitle(); 
} 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.animal_info); 

    //findViewById for the TextView and ImageView 
    //setText() for TextView and setImageResource() for ImageView 
} 
} 

Sorry für die lange Frage, habe ich versucht, es so kurz wie möglich zu machen Könnt ihr mir helfen, den Fehler herauszufinden? Vielen Dank vor

+2

Beitrag die 'logcat' Fehlermeldung, damit wir Ihnen helfen können :) –

Antwort

1

Sie versuchen, Arraylist von Absicht zu erhalten, während Sie nicht putStringArrayList und PutIntegerArrayList Methoden setzen.

putIntegerArrayListExtra(String name, ArrayList<Integer> value) 

putStringArrayListExtra(String name, ArrayList<String> value) 

so ändern Aktivität Aufruf zu folgenden:

Intent i = new Intent(Home.this, ChangeContent.class); //from Manifest 
i.putIntegerArrayListExtra("drawables", drawable); 
i.putStringArrayListExtra("titles", titles); 
startActivity(i); 

und erhalten Daten von Absicht in onCreate Verfahren durch folgende Methoden: getIntegerArrayListExtra und getStringArrayListExtra

auch wir können folgende contentChanged indem Methode zu statisch, dadurch müssen Sie nicht viel Änderungen in Ihrem Anwendungscode tun, tun Sie einfach folgendes:

public class ChangeContent extends Activity { 

    TextView title1, title2; 
    ImageView pic1, pic2; 
    private static ArrayList<Integer> drawable; 
    private static ArrayList<String> title; 

public static ChangeContent(AnimalData data){ 
    drawable = new ArrayList<Integer>(); 
    title = new ArrayList<String>(); 
    drawable = data.getDrawable(); 
    title = data.getTitle(); 
} 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.animal_info); 

    //findViewById for the TextView and ImageView 
    //setText() for TextView and setImageResource() for ImageView 
} 
} 
+0

Muss ich Bundle verwenden, um zu sen d und die Daten erhalten? BTW Danke für die schnelle Antwort – hrsetyono

+0

Es funktioniert mit Bundle, Vielen Dank – hrsetyono

0

Ihr Ansatz ist falsch -

public Home(){ 
ad = new AnimalData(); 
cc = new ChangeContent(ad); 
drawable = new ArrayList<Integer>(); 
title = new ArrayList<String>() 

}

ChangeContent ist ein Aktivitätsklasse so, Sie wie das nicht-Parameter übergeben.

Passsing Klasse sollte es sein serializable und verwendet -

startActivity(new Intent(this, ChangeContent.class) 
      .putExtra("key", ad); 

Und in Ihrer ChangeContent Klasse extrahiert die Klasse von Intent

Also, Ihr Code-Design und voran gehen ändern. Viel Glück.

+0

Danke für die Antwort, aber immer noch unerwartet gestoppt – hrsetyono

+0

geben Sie mir Ihr Fehlerprotokoll –

+0

Ich habe gerade festgestellt, dass der Fehler wegen NullException ist, so dass die Daten nicht gespeichert Ich habe putIntegerArrayListExtra() wie vom anderen Mann vorgeschlagen und es funktioniert bereits Vielen Dank für Ihre Zeit – hrsetyono

1

Siehe Antwort von RajaReddy P hier:

https://stackoverflow.com/a/9937854

In der Sendeklasse Verwendung:

Intent intent = new Intent(PhotoActivity.this,PhotoActivity1.class); 
intent.putIntegerArrayListExtra("VALUES", image);    
startActivity(cameraIntent); 

.. und in der Empfängerklasse Verwendung:

Intent i = getIntent(); 
ArrayList<Integer> img = i.getIntegerArrayListExtra("VALUES");