Android - findViewById () и динамическая установка идентификаторов - PullRequest
0 голосов
/ 31 марта 2012

У меня есть опрос идентификаторов (ids.xml), и я назначаю идентификаторы для представлений, которые я создаю динамически. Теперь мой вопрос довольно прост - предположим, я создаю новый вид и присваиваю ему идентификатор с setId() в сочетании с R.id.uniqueId. Позже я могу получить доступ к представлению с помощью findViewById(R.id.uniqueId)?

Если это так, что может быть причиной того, что он возвращает ноль?

Вот игрушечный пример: ОБНОВЛЕНО

LinearLayout l = new LinearLayout(this);
l.setId(R.id.mId);
setContentView(l); //i see on screen the views added to 'l'
l = (LinearLayout) findViewById(R.id.mId); //it returns null :(

Почему он не регистрирует \ сопоставляет назначенный идентификатор с назначенным ему видом?

Ответы [ 3 ]

2 голосов
/ 31 марта 2012

Есть ли у вашего желаемого представления родительское представление, которое вы могли бы использовать для вызова parent.findViewById?Это может помочь сузить вашу проблему.

Одна вещь, которую я заметил, отсутствует в вашем кратком примере: вам нужно убедиться, что вы добавляете новый LinearLayout в иерархию представления, прежде чем сможете найти его с помощью findViewById:

findViewById(R.id.parent).addView(l)

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

1 голос
/ 31 марта 2012

сталкивался с этим много раз, попробуйте очистить ваш проект, сделав очистку. Также проверьте, findViewById () возвращает значение null для пользовательского компонента в XML макета, а не для других компонентов

0 голосов
/ 31 марта 2012

Из того, что вы нам дали, видно, что представление никогда не добавляется в представление действия.Это необходимо, так как findViewById использует вид деятельности в качестве родительского для поиска дочернего представления с этим идентификатором.

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

...