Buradaki yanıtlar zaten harika, ancak özel ViewGroup'lar için işe yaramıyor. Tüm özel Görünümlerin durumlarını korumasını sağlamak için geçersiz kılmanız onSaveInstanceState()
veonRestoreInstanceState(Parcelable state)
her sınıfta. Ayrıca, ister xml'den şişirilmiş ister programlı olarak eklenmiş olsunlar, hepsinin benzersiz kimliklere sahip olduğundan emin olmanız gerekir.
Ne geldi Kobor42 cevap gibi gibiydi, ama görünümleri özel bir ViewGroup programlı olarak eklemek ve benzersiz kimlikleri atama çünkü hata kaldı.
Mato tarafından paylaşılan bağlantı işe yarayacaktır, ancak tek tek Görünümlerin hiçbirinin kendi durumunu yönetmediği anlamına gelir - tüm durum ViewGroup yöntemlerine kaydedilir.
Sorun, bu ViewGroups birden çok bir düzene eklendiğinde, xml'deki öğelerinin kimlikleri artık benzersiz değildir (xml'de tanımlanmışsa). Çalışma zamanında, View.generateViewId()
bir Görünüm için benzersiz bir kimlik almak üzere statik yöntemi çağırabilirsiniz . Bu yalnızca API 17'den edinilebilir.
İşte benim kod ViewGroup (soyut ve mOriginalValue bir tür değişkeni):
public abstract class DetailRow<E> extends LinearLayout {
private static final String SUPER_INSTANCE_STATE = "saved_instance_state_parcelable";
private static final String STATE_VIEW_IDS = "state_view_ids";
private static final String STATE_ORIGINAL_VALUE = "state_original_value";
private E mOriginalValue;
private int[] mViewIds;
// ...
@Override
protected Parcelable onSaveInstanceState() {
// Create a bundle to put super parcelable in
Bundle bundle = new Bundle();
bundle.putParcelable(SUPER_INSTANCE_STATE, super.onSaveInstanceState());
// Use abstract method to put mOriginalValue in the bundle;
putValueInTheBundle(mOriginalValue, bundle, STATE_ORIGINAL_VALUE);
// Store mViewIds in the bundle - initialize if necessary.
if (mViewIds == null) {
// We need as many ids as child views
mViewIds = new int[getChildCount()];
for (int i = 0; i < mViewIds.length; i++) {
// generate a unique id for each view
mViewIds[i] = View.generateViewId();
// assign the id to the view at the same index
getChildAt(i).setId(mViewIds[i]);
}
}
bundle.putIntArray(STATE_VIEW_IDS, mViewIds);
// return the bundle
return bundle;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
// We know state is a Bundle:
Bundle bundle = (Bundle) state;
// Get mViewIds out of the bundle
mViewIds = bundle.getIntArray(STATE_VIEW_IDS);
// For each id, assign to the view of same index
if (mViewIds != null) {
for (int i = 0; i < mViewIds.length; i++) {
getChildAt(i).setId(mViewIds[i]);
}
}
// Get mOriginalValue out of the bundle
mOriginalValue = getValueBackOutOfTheBundle(bundle, STATE_ORIGINAL_VALUE);
// get super parcelable back out of the bundle and pass it to
// super.onRestoreInstanceState(Parcelable)
state = bundle.getParcelable(SUPER_INSTANCE_STATE);
super.onRestoreInstanceState(state);
}
}