My example is adapted from one of the sample applications that come with one of the compatibility libraries. That's the layout file:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/fragment_menu_msg" />
<CheckBox android:id="@+id/menu1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:checked="true"
android:text="@string/fragment1menu">
</CheckBox>
<CheckBox android:id="@+id/menu2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:checked="true"
android:text="@string/fragment2menu">
</CheckBox>
</LinearLayout>
And here some Java code:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_menu);
ViewGroup layout = (ViewGroup) findViewById(R.id.layout);
Button btn = new Button(getApplication());
btn.setId(1);
btn.setText("Button 1");
layout.addView(btn);
mCheckBox1 = (CheckBox) findViewById(R.id.menu1);
mCheckBox1.setOnClickListener(mClickListener);
}
final OnClickListener mClickListener = new OnClickListener() {
public void onClick(View v) {
ViewGroup layout = (ViewGroup) findViewById(R.id.layout);
Button btn = new Button(v.getContext());
btn.setId(2);
btn.setText("Button 2");
layout.addView(btn);
}
};
The activity starts, you disable the first checkbox, one button (button 2) is added to the layout, you change the screen orientation and button 2 (added in the onClickListener method) disappears.
Screenshots on Directupload.net
I have read a lot of stuff about Handling Runtime Changes but I still don't have a clear picture how to prevent Button 2 to disappear in the avobe example. Any help is highly appreciated.
Activity restarts when you change orientation and all its state is lost (in your case dynamically added button). You must be prepared to handle this as there are other situations where this might happen. For example your application might be killed if it is in background and a device needs to free memory.
The correct solution is to save the state of the activity before it is destroyed and then restore it once it is recreated. Something like this:
@Override
protected void onSaveInstanceState(Bundle outState) {
// save state of your activity to outState
}
@Override
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
// restore state of your activity from savedInstanceState
}
}
See Saving activity state topic in official documentation for more details.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With