Как воссоздать LinearLayout Views после поворота?
Все компилируется нормально, ошибок во время выполнения нет, все работает как положено, но как только телефон-эмулятор поворачивается, все, кроме первого View (Button createBtn = new Button(this)
) исчезают я использую onSaveInstanceState
а также onRestoreInstanceState
,
У меня есть действие, где представления создаются динамически, используя ScrollView
а также LinearLayout
, включая первый вид, кнопку создания. Действие создает экземпляры ArrayList, которые затем снова добавляются в расширение ArrayList-Object, которое реализует Parcelable
:
private ArrayList<VocCard> mVocCardList;
добавлен в
public class VocCollection extends ArrayList implements Parcelable
экземпляр
private VocCollection mListCollection;
На самом деле, mVocCardList
перезаписывается и добавляется в mListCollection
каждый раз при нажатии кнопки "Создать", но это не имеет значения, так как все еще возможно получить размер mListCollection
перед добавлением нового элемента в список. createBtn.setOnClickListener
также создает пару новых видов, которые названы в честь количества элементов в mListCollection
,
По крайней мере, новые представления, созданные после поворота, все еще следуют правилу именования, что означает, что mListCollection
может быть сохранен в методе.
Если честно, я не очень доволен реализацией, использующей ScrollView
а также LinearLayout
, но мне потребовалось довольно много времени, чтобы найти способ: 1) динамически создавать представления внутри действия и 2) найти способ сохранения более сложных данных в Bundle
(вот почему я сделал реализацию Parcelable
).
Вот некоторый код из указанной деятельности:
public class LoadActivity extends AppCompatActivity {
private static final String STATE_COLLECTION = "state_of_voc_collection_list";
private VocCollection mListCollection;
private ArrayList<VocCard> mVocCardList;
private LinearLayout ll;
private ScrollView scrl;
...
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
// Restore value of List from saved state
mListCollection = (VocCollection) savedInstanceState.getParcelableArrayList(STATE_COLLECTION);
}
scrl = new ScrollView(this);
ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
scrl.addView(ll);
Button createBtn = new Button(this);
createBtn.setText("Create");
ll.addView(createBtn);
//Add for each element from mListCollection 2 Views to the LinerarLayout ll
if(mListCollection == null){
int count = 0;
}else{
int count = mListCollection.size();
for(int i = count; i<count; i++) {
TextView tv = new TextView(getApplicationContext());
tv.setText("saved Voc List " + (i + 1));
ll.addView(tv);
Button btn = new Button(getApplicationContext());
btn.setText("Start saved Voc List " + (i + 1));
}
}
...
...
createBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
//Create VocCards and add to List
mVocCardList = new ArrayList<>(3);
for (int i = 0; i < 3; i++) {
mVocCardList.add(new VocCard(voc_f[i], voc_n[i]));
}
int count = 0;
if(mListCollection != null){
count = mListCollection.size();
mListCollection.add(mVocCardList);
}else{
mListCollection = new VocCollection();
mListCollection.add(mVocCardList);
}
TextView tv = new TextView(getApplicationContext());
tv.setText("new Voc List "+(count+1));
ll.addView(tv);
Button btn = new Button(getApplicationContext());
btn.setText("Start new Voc List "+(count+1));
ll.addView(btn);
}
});
this.setContentView(scrl);
}
...
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the current List state
savedInstanceState.putParcelableArrayList(STATE_COLLECTION, (ArrayList<? extends Parcelable>) mListCollection);
// call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
...
...
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
//Restore the VocList List
mListCollection = (VocCollection) savedInstanceState.getParcelableArrayList(STATE_COLLECTION);
}
}
и код VocCollection
, как предложено:
package com.dede123.smartcards.vocdata;
import android.annotation.SuppressLint;
import android.os.Parcel;
import android.os.Parcelable;
import com.dede123.smartcards.VocCard;
import java.util.ArrayList;
@SuppressLint("ParcelCreator")
public class VocCollection extends ArrayList implements Parcelable {
protected VocCollection(Parcel in) { }
public static final Creator<VocCollection> CREATOR = new Creator<VocCollection>() {
@Override
public VocCollection createFromParcel(Parcel in) {
return new VocCollection(in);
}
@Override
public VocCollection[] newArray(int size) {
return new VocCollection[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
public VocCollection(){ }
}