Раздувать vs findViewById
Предположим, что у меня есть простой макет xml, например:
button.xml:
<Button
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Существуют ли различия в следующих вызовах? и какой из них я должен использовать?
button = (Button) getLayoutInflater().inflate(R.layout.button, null);
и
View v = getLayoutInflater().inflate(R.layout.button, null);
button = (Button) v.findViewById(R.id.button01);
Ответы
Ответ 1
Это создает новое представление с заданным макетом, где "R.layout.button" генерируется именем файла xml "button.xml". Каждый раз, когда вы вызываете .inflate(...), вы получите новый экземпляр.
View v = getLayoutInflater().inflate(R.layout.button, null);
-
В то время как этот находит существующее представление в макете, где R.id.button01 генерируется с помощью имени id 'android: id = "@+ id/button01" '. Каждый раз, когда вы вызываете .findViewById(R.id.button01), вы получите тот же экземпляр, так как представление "v" будет одинаковым.
button = (Button) v.findViewById(R.id.button01);
Ответ 2
Первый вариант чище и немного более эффективен.
Ваш макет надувной системы вернет значение Button
. При первом варианте вы получаете доступ к Button
напрямую. При втором варианте вы нажимаете кнопку до View
, а затем просматриваете представление с заданным идентификатором, что является лишним бесполезным сравнением, поскольку представление с идентификатором, который вы ищете в иерархии, оказывается сама кнопка. Итак, во втором варианте v == button
.