Раздувать 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.