我遇到了一個問題,我知道根本原因,但沒有看到解決問題的方法。如果在活動中多次使用自定義複合組件,則從視圖保存的值將相互覆蓋。爲了更容易解釋,我做了下面的例子。在屏幕上保存狀態在多次使用複合組件時旋轉
新組件的xml,只有一個EditText使它更短。
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >
<EditText
android:id="@+id/custom_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="number" >
</EditText>
</merge>
實現新行爲的類只是使佈局膨脹。
public class CustomView extends LinearLayout {
public CustomView(Context context) {
this(context, null);
}
public CustomView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.custom_view, this, true);
}
}
並使用其中的2個佈局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<test.customview.CustomView
android:id="@+id/customView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</test.customview.CustomView>
<test.customview.CustomView
android:id="@+id/customView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</test.customview.CustomView>
</LinearLayout>
當屏幕旋轉時,第二個視圖的值也會在第一個視圖中恢復。
深入研究框架的代碼我發現從View類中定義的onSaveInstanceState返回的Parcelable對象與關鍵對象的ID放在SparseArray中。因爲我多次包含CustomView,因此ID爲「custom_text」的EditText也會多次添加。具有相同的ID,保存的值將相互覆蓋。
我在尋找任何有關如何實際應用的建議。現在,我看不出有什麼辦法來改變這些標識符。
謝謝你,你的代碼正在工作:)我花了一段時間才明白爲什麼,但最終我得到了它。不要擔心你的英語,這很好。歡迎來到StackOverflow :) – azertiti 2012-04-03 22:20:51