Как воссоздать LinearLayout Views после поворота? - PullRequest
0 голосов
/ 11 мая 2018

Все компилируется нормально, ошибок во время выполнения нет, все работает как положено, но как только телефон-эмулятор поворачивается, все, кроме первого просмотра (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(){  }
}
...