Раздутые представления теряют свое состояние, когда фрагмент извлекается из backstack

#android #android-fragments

#Android #android-фрагменты

Вопрос:

Я несколько раз раздуваю один и тот же макет и добавляю их в одно и то же представление контейнера. Вот что я делаю:

layout_inflated.xml

 <LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@ id/parentLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RadioButton
        android:id="@ id/radioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <EditText
        android:id="@ id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

</LinearLayout>
  

Я раздуваю этот макет и добавляю в другое представление следующим образом:

 for(int i = 0; i < 3; i  ) {
    final View rowLayout = layoutInflater.inflate(R.layout.layout_inflated, null, false);
    rowLayout.setTag(i);
    containerView.addView(rowLayout);
}
  

Затем предположим, что я ввожу числа "111" , "222" и "333" в edittexts первой, второй и третьей строк. Затем я проверяю радиокнопку в 3-й строке и оставляю радиокнопки 1-й и 2-й строк непроверенными. Затем я перехожу к следующему фрагменту, и этот фрагмент помещается в backstack. А затем я возвращаюсь к этому фрагменту, и он извлекается из backstack. На этом этапе все 3 радиокнопки становятся отмеченными, и все edittexts имеют "333" в своих полях. То есть все строки имеют состояние третьей строки.

Но, если я не раздуваю строки из того же xml и не создаю строки, подобные приведенным ниже, тогда все работает нормально:

 for(int i = 0; i < 3; i  ) {
    LinearLayout rowLayout = new LinearLayout(context);
    rowLayout.setOrientation(HORIZONTAL);
    RadioButton radioButton = new RadioButton(context);
    EditText edittext = new EditText(context);
    rowLayout.addView(radioButton);
    rowLayout.addView(editText);
    containerView.addView(rowLayout);
}
  

Я подозреваю, что когда я несколько раз раздуваю один и тот же xml и добавляю их в одно и то же родительское представление, поскольку все они имеют одинаковые идентификаторы, что-то происходит, и Android не может их различить. Мой реальный макет строки намного сложнее и не может создавать его динамически, мне приходится раздувать его из xml. Итак, кто-нибудь может объяснить, почему это происходит и как я могу этого избежать?

Редактировать: При отладке я вижу, что методы onTextChanged() и onCheckedChanged() вызываются автоматически, когда фрагмент извлекается из backstack.

Спасибо.

Ответ №1:

Я думаю, что ваша проблема заключается в идентификаторе одного и того же элемента в одном представлении. Согласно документации

Идентификаторы представлений не обязательно должны быть уникальными во всем дереве, но рекомендуется убедиться, что они, по крайней мере, уникальны в той части дерева, которую вы ищете.

И, насколько я знаю findViewById() , метод вернет первое появление представления с предоставленным идентификатором. Это может быть причиной, по которой система перерисовывает ваши представления со значениями только из последнего просмотра, после чего активность возвращается из backstack.

Поэтому просто удалите android: id из xml-файла. Если они вам нужны, используйте setId(int id) .