Я столкнулся с проблемой, когда я знаю причину, но не вижу способа ее исправить.Если пользовательский составной компонент используется в действии несколько раз, значения, сохраненные в представлениях, будут перезаписывать друг друга.Чтобы объяснить это проще, я сделал следующий пример.
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>
Класс, реализующий новое поведение, только раздувающийlayout.
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>
При повороте экрана значение из второго просмотра также восстанавливается в первом.
Копаясь в коде фреймворка, я обнаружил, что объекты Parcelable, возвращаемые из onSaveInstanceState, определенного в классе View, помещаются в SparseArray с идентификатором ключевого объекта.Поскольку я включаю CustomView несколько раз, EditText с идентификатором «custom_text» также добавляется несколько раз.Имея тот же идентификатор, сохраненные значения будут перезаписывать друг друга.
Я ищу любые предложения о том, как это должно быть на самом деле реализовано.Сейчас я не вижу способа изменить эти идентификаторы.