Edit: See the accepted answer. Lesson: Sometimes views will save and restore their state automatically. This happens AFTER onCreate. This can cause the overwriting of stuff you did in onCreate. If you don’t have unique ids, all views of a certain kind (in my case textboxes) can be overwritten with the same saved state. (ps: thanks for your help everyone!)
So, I have a simple linear layout and I want to add some views that have checkboxes with images. Everything works fine until I switch the orientation of my android phone. When I do it goes back through the onCreate but this time the checkboxes all end up with the same text. Weirdly, the images appear fine.
My question is: why is it doing this and how can I make it appear like the first time everytime?
In case that makes no sense here’s an example: (Edit: It turns out it always shows the last element’s text)
What I see at first
[] a *a's image*
[] b *b's image*
[] c *c's image*
[] d *d's image*
Then, after rotating my phone, it redraws
[] d *a's image*
[] d *b's image*
[] d *c's image*
[] d *d's image*
My original code is pretty complex, but i constructed the following that demonstrates the problem.
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>
Does setting a unique ID for each AnswerView solve your issue? You could achieve that as follows: