Как можно избежать дублирования идентификаторов в дочерних компонентах Android? - PullRequest
3 голосов
/ 25 ноября 2010

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

Приложение использует TableLayout, где каждый TableRow содержит EditText и некоторыеКнопки.

Табличные строки можно добавлять и удалять во время выполнения.Казалось, все работает нормально, пока я случайно не наклонил свое устройство.Дисплей отреагировал и переставил компоновку, но внезапно все значения были одинаковыми в каждом ряду.

После некоторого расчесывания головы я выяснил, что происходит.Из-за смены ориентации Android перезапускал активность.Когда это происходит, Android пытается сохранить и затем восстановить состояние вашего экземпляра, но делает это путем сохранения данных, относящихся к идентификатору компонента.

В моем случае, поскольку все строки создаются из одного и того же макета, тоEditText в каждой строке имеет одинаковый идентификатор.Насколько я могу судить, результат заключается в том, что при сохранении информации она перезаписывается для каждой строки, поэтому выигрывает последняя строка.

При восстановлении существует только одно значение, связанное с этим идентификатором, ипоэтому он применяется ко всем строкам!

В моем случае я смог обойти это, поскольку мне все равно не нужно было сохранять значения.В моем onSaveInstanceState я не вызываю super.onSaveInstanceState, а также в onRestoreInstanceState.

Так что, в конце концов, это подводит меня к моему вопросу!

Что если я ДЕЙСТВИТЕЛЬНО хотел, чтобы эти отдельные значения строк были сохраненыа восстановили?Есть ли приемлемый способ генерации уникальных идентификаторов на повторно используемых компонентах (в моем случае TableRow)?

Ответы [ 3 ]

1 голос
/ 31 октября 2011

На вашем месте я бы не использовал your_view.setId(your_new_id) в представлении EditText, потому что это делает ваше приложение менее стабильным.

Я бы использовал your_ view.setTag(some_unique_tag), а затем findViewWithTag(some_unique_tag), чтобы снова просмотреть представление EditText.

findViewWithTag(some_unique_tag) может быть любым Object - лично я предпочитаю String, потому что тогда легко сделать несколько описательных и уникальных тегов.

Помните, что только View s, которые вы используете .setTag, имеет теги.

1 голос
/ 16 сентября 2014

В дополнение к setId в классе View есть метод generateViewId . Если вы хотите, чтобы это было до 17 версий, вы можете просто скопировать его из источников.

0 голосов
/ 25 ноября 2010

Вы можете сгенерировать ваши TableRows в Java и использовать View.setId().Вы также можете поместить строку таблицы в файл макета XML, загрузить ее через java и установить идентификаторы, но это выглядит сложнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...