#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)
.