2012-04-07 3 views
2

Я начинающий программист, и я пытаюсь изучить кодировку Android с помощью Eclipse. Это мой первый раз, используя StackOverflow.Android ArrayList, неожиданно остановился

Только для учебных целей я хочу сделать простую Энциклопедию животных.

В моем классе «Дом» есть несколько кнопок: «Собака», «Кошка», «Птица» и т. Д. Когда я нажимаю кнопку, она приведет меня к того же макета, но, разумеется, с разными содержание.

  • Так что я создал класс с именем AnimalData, который держит ArrayList<Integer> хранить R.drawable.xxx и ArrayList<String> хранить текст, который я буду ставить под картинкой (например, «Бульдог» или «Хаски»)

  • Затем я создал класс с именем ChangeContent, чтобы установить весь этот Drawable и текст в XML

  • Но всякий раз, когда я нажимаю кнопку, это приводит к Остановились Неожиданно Ошибка

Ниже укороченный Home класс, «грохот-мейкер» не здесь. Я проверил всю строку кода в строке, используя Thread.sleep(2000), поэтому, если мое приложение падает до 2 секунд, ошибка перед кодом sleep() и наоборот.

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

AnimalData просто типичный геттер сеттер, поэтому я просто пропустить код для этого

Ошибка находится сразу после ChangeContent начала, потому что даже когда я положил сон() на первом линии конструктора, это не имеет никакого эффекта.

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

Извините за длинный вопрос, я пытался сделать его как можно более коротким Может вы, ребята, помочь мне понять ошибку из? Спасибо до

+2

сообщение сообщение об ошибке «logcat», чтобы мы могли вам помочь :) –

ответ

1

Вы пытаетесь получить arraylist от намерения, тогда как вы не ставите методы putStringArrayList и putIntegerArrayList.

putIntegerArrayListExtra(String name, ArrayList<Integer> value) 

putStringArrayListExtra(String name, ArrayList<String> value) 

так Изменение вызова активности к следующему:

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

и получить данные намерения в OnCreate метод, с помощью следующих методов: getIntegerArrayListExtra и getStringArrayListExtra

вы также можете сделать следующее путем contentChanged метод к статическому, вам не нужно будет делать много изменений в коде приложения, просто выполните следующие действия:

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

Нужно ли использовать Bundle to sen d и получать данные? BTW Спасибо за быстрый ответ – hrsetyono

+0

Он работает с Bundle, спасибо большое – hrsetyono

0

Ваш подход является неправильным -

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

}

ChangeContent класс активности так, вы не передаете параметр, как это.

Passsing класс должен сериализовать и использовать его -

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

И в своем классе ChangeContent извлечь класс из Intent

Таким образом, изменить свой дизайн-код и идти вперед. Удачи.

+0

Спасибо за ответ, но все же остановился неожиданно – hrsetyono

+0

дайте мне свой журнал ошибок –

+0

Я просто понял, что ошибка вызвана NullException, поэтому данные не хранятся Я использовал putIntegerArrayListExtra(), как предложил другой парень, и он уже работает Большое спасибо за ваше время – hrsetyono

1

Смотрите ответ на RajaReddy P здесь:

https://stackoverflow.com/a/9937854

При использовании класса посыла:

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

.. и в использовании класса приемника:

Intent i = getIntent(); 
ArrayList<Integer> img = i.getIntegerArrayListExtra("VALUES"); 
Смежные вопросы