Các câu trả lời ở đây đã rất hay, nhưng không nhất thiết phải có hiệu quả đối với Viewgroup tùy chỉnh. Để có được tất cả các Chế độ xem tùy chỉnh để giữ trạng thái của chúng, bạn phải ghi đè onSaveInstanceState()
và onRestoreInstanceState(Parcelable state)
trong mỗi lớp. Bạn cũng cần đảm bảo tất cả chúng đều có id duy nhất, cho dù chúng được thổi phồng từ xml hoặc được thêm vào theo chương trình.
Những gì tôi nghĩ ra giống như câu trả lời của Kobor42, nhưng lỗi vẫn còn do tôi đang thêm Chế độ xem vào một Viewgroup tùy chỉnh theo chương trình và không gán id duy nhất.
Liên kết được chia sẻ bởi mato sẽ hoạt động, nhưng điều đó có nghĩa là không có Chế độ xem riêng lẻ nào quản lý trạng thái của riêng họ - toàn bộ trạng thái được lưu trong các phương thức Viewgroup.
Vấn đề là khi nhiều Viewgroup này được thêm vào bố cục, id của các thành phần của chúng từ xml không còn là duy nhất (nếu được xác định trong xml). Khi chạy, bạn có thể gọi phương thức tĩnh View.generateViewId()
để lấy id duy nhất cho Chế độ xem. Điều này chỉ có sẵn từ API 17.
Đây là mã của tôi từ Viewgroup (nó là trừu tượng và mOrigenValue là một biến loại):
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);
}
}