Редактировать: см. Принятый ответ. Урок. Иногда представления сохраняют и восстанавливают свое состояние автоматически. Это происходит ПОСЛЕ создания. Это может привести к перезаписи материала, который вы сделали в onCreate. Если у вас нет уникальных идентификаторов, все представления определенного вида (в моем случае текстовые поля) могут быть перезаписаны с одинаковым сохраненным состоянием. (ps: всем спасибо за помощь!)
Итак, у меня есть простой линейный макет, и я хочу добавить несколько видов, которые имеют флажки с изображениями. Все работает нормально, пока я не переключу ориентацию моего телефона Android. Когда я это делаю, он возвращается через onCreate, но на этот раз все флажки заканчиваются одинаковым текстом. Странно, изображения выглядят нормально.
Мой вопрос: почему он это делает, и как я могу сделать так, чтобы он появлялся, как в первый раз, каждый раз?
В случае, если это не имеет смысла, вот пример: (Edit: оказывается, он всегда показывает текст последнего элемента)
Что я вижу сначала
[] a *a's image*
[] b *b's image*
[] c *c's image*
[] d *d's image*
Затем, после вращения моего телефона, он перерисовывает
[] d *a's image*
[] d *b's image*
[] d *c's image*
[] d *d's image*
Мой оригинальный код довольно сложный, но я построил следующее, демонстрирующее проблему.
Main.java:
public class Main extends Activity {
ArrayList<AnswerView> answers = new ArrayList<AnswerView>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView title = (TextView)findViewById(R.id.questionText);
title.setText("This is a test");
HashMap<String, Drawable> answerInfo = new HashMap<String, Drawable>();
Resources res = getResources();
answerInfo.put("a", res.getDrawable(R.drawable.flower_orange));
answerInfo.put("b", res.getDrawable(R.drawable.flower_white));
answerInfo.put("c", res.getDrawable(R.drawable.leaf));
answerInfo.put("d", res.getDrawable(R.drawable.flower_yellow));
setBoxes(answerInfo);
}
private void setBoxes(HashMap<String, Drawable> answerInfo) {
LinearLayout answerList = (LinearLayout)findViewById(R.id.answerlist);
AnswerView cb = null;
//Remove all existing answer views
answerList.removeAllViews();
answers.clear();
//For each possible answer create a answer views
for (String s : answerInfo.keySet()) {
cb = new AnswerView(this, s, answerInfo.get(s));
answers.add(cb);
String text = cb.getText();
answerList.addView(cb);
}
}
}
AnswerView.java
public class AnswerView extends RelativeLayout {
private CheckBox m_checkbox;
private ImageView m_image;
//private Context m_context;
public AnswerView(Context context, String answer, Drawable d) {
super(context);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.image_checkbox, this, true);
m_checkbox = (CheckBox) view.findViewById(R.id.image_checkbox_cb);
m_image = (ImageView) view.findViewById(R.id.image_checkbox_img);
//m_context = context;
m_checkbox.setText(answer);
m_image.setImageDrawable(d);
m_image.setVisibility(VISIBLE);
}
public void setChecked(boolean checked) {
m_checkbox.setChecked(checked);
}
public boolean isChecked() {
return m_checkbox.isChecked();
}
public String getText() {
return m_checkbox.getText().toString();
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dip">
<TextView android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/questionText"
android:textSize="18sp"/>
<LinearLayout android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/answerlist"/>
<LinearLayout android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<Button
android:layout_width="200dip"
android:layout_height="wrap_content"
android:text="Enter"
android:id="@+id/buttonAnswerEnter"/>
/>
</LinearLayout>
</LinearLayout>
</ScrollView>
image_checkbox.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_checkbox_cb"></CheckBox>
<ImageView
android:id="@+id/image_checkbox_img"
android:layout_width="100dip"
android:layout_height="100dip"
android:visibility="gone"></ImageView>
</LinearLayout>