Что значит раздувать вид из xml файла?

278

Я новичок в разработке для Android и постоянно сталкиваюсь со ссылками на раздувание видов из XML-файла макета. Я гуглил и искал руководство по разработке, но так и не смог понять, что это значит. Если бы кто-то мог привести очень простой пример, он был бы очень признателен.

Брендан Вайнштейн
источник

Ответы:

257

Когда вы пишете макет XML, он будет раздут ОС Android, что в основном означает, что он будет визуализирован путем создания объекта представления в памяти. Давайте назовем это неявной инфляцией (ОС будет раздувать мнение для вас). Например:

class Name extends Activity{
    public void onCreate(){
         // the OS will inflate the your_layout.xml
         // file and use it for this activity
         setContentView(R.layout.your_layout);
    }
}

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

  1. Получить экземпляр LayoutInflater
  2. Укажите XML для раздувания
  3. Используйте возвращенный View
  4. Установить вид содержимого с возвращенным видом (выше)

Например:

LayoutInflater inflater = LayoutInflater.from(YourActivity.this); // 1
View theInflatedView = inflater.inflate(R.layout.your_layout, null); // 2 and 3
setContentView(theInflatedView) // 4
Cristian
источник
24
если inflate = рендеринг, то какая польза от onDraw (), точно?
PypeBros
@sylvainulg, R.id.view используется для изменения атрибутов элемента xml, и inflate может сделать то же самое. раздувание особенно полезно в пользовательских представлениях. Чтобы накачать весь XML-файл, используется знакомый setContentView класса Activity. Вид должен надувать каждый вид вручную, используя LayoutInflater object.inflate (). Деятельность имеет жизненный цикл. Вместо этого у представления есть цикл рисования. Inflater особенно полезен с пользовательским представлением вместо использования разметки predifiend в XML-файле.
Шри Рама
@Cristian Пожалуйста, как вы думаете, вы могли бы дать мне несколько советов / идей здесь goo.gl/E37NSu
eddy
24
Я не думаю, что раздувание - это рендеринг, а раздувание - это фактическое создание объекта View в памяти на основе содержимого файла XML. После надувания вид будет в памяти не обязательно виден.
Ахмед
1
@MattJ. Ну, мой ответ может быть плохо сформулирован. Android будет раздувать представление не только из-за наличия XML-файла, но и когда вы вызываете setContentView или вручную раздуваете макет. К тому времени, когда вы вызываете, findViewByIdобъекты представления уже находятся в памяти, и единственная причина, по которой вы это делаете, - это получить ссылку на этот конкретный объект (либо изменить его, либо извлечь из него данные).
Кристиан
160

«Раздувать» представление означает брать XML макета и анализировать его, чтобы создать объекты представления и группы представлений из элементов и их атрибутов, указанных внутри, а затем добавить иерархию этих представлений и групп представлений в родительскую ViewGroup. Когда вы вызываете setContentView (), он присоединяет созданные представления от чтения XML к действию. Вы также можете использовать LayoutInflater для добавления представлений в другую ViewGroup, что может быть полезным инструментом во многих случаях.

JJB
источник
22
это звучит как гораздо более точное описание для меня.
PypeBros
4
Я все еще немного смущен терминологией «инфляции». (Если бы я только мог перестать изображать воздух, идущий во что-то). Но, возможно, это поможет: я просто запустил программу распаковки на терминале Ubuntu и заметил терминологию: «надувать: X / Y / z.xml». Я предполагаю, что это действительно та же самая концепция.
Бен Огорек
6
«Раздувание» в этом случае означает, что платформа берет описание макета из XML и заполняет иерархию представления фактическими объектами представления. Таким образом, это надувает в смысле заполнения макета.
JJB
1
@FranciscoCorrales - Конечно. Наиболее распространенная вещь, для которой вы бы использовали подобные вещи, это что-то вроде ListAdapter , где вы хотите заполнить строку. Я использовал его для заполнения таких вещей, как LinearLayouts, перебирая некоторые объекты данных таким образом, чтобы не предлагать подход ListAdapter.
JJB
36

Раздувание - это процесс добавления представления (.xml) к активности во время выполнения. Когда мы создаем listView, мы раздуваем каждый из его элементов динамически. Если мы хотим создать ViewGroup с несколькими представлениями, такими как кнопки и текстовое представление, мы можем создать ее следующим образом:

Button but = new Button();
but.setText ="button text";
but.background ...
but.leftDrawable.. and so on...

TextView txt = new TextView();
txt.setText ="button text";
txt.background ... and so on...

Затем мы должны создать макет, в который мы можем добавить вышеуказанные виды:

RelativeLayout rel = new RelativeLayout();

rel.addView(but);

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

Android облегчает нам создание простого XML-файла и разработку его стиля и атрибутов в XML-формате, а затем просто раздувают его везде, где нам это нужно, без необходимости устанавливать ограничения программно.

LayoutInflater inflater = 
              (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View menuLayout = inflater.inflate(R.layout.your_menu_layout, mainLayout, true);
//now add menuLayout to wherever you want to add like

(RelativeLayout)findViewById(R.id.relative).addView(menuLayout);
Zar E Ahmer
источник
Мне нравится, как вы описали инфляцию на самом деле, показывая, как вы будете делать это вручную.
Даниэль
1
Что означает параметр инфляционного attachToRoot?
FLZ
См. Подробный ответ stackoverflow.com/questions/12567578/…
Zar E Ahmer
5

Я думаю, что здесь «надувать представление» означает извлекать файл layout.xml, рисуя представление, указанное в этом XML-файле, и POPULATING (= раздувать) родительскую viewGroup с созданным представлением.

Джейдип Ранипа
источник
4

Определение дилетанта для инфляции может заключаться в преобразовании кода XML в код Java. Просто для понимания, например, если у нас есть тег в XML, ОС должна создать соответствующий объект Java в памяти, поэтому inflatter читает XMLtags и создает соответствующие объекты в Java.

user3458211
источник
2

Поскольку мы превращаем пользовательский интерфейс в XML, но объекты представления - это то, что мы отображаем, поэтому нам каким-то образом необходимо преобразовать xml в объекты представления, поэтому надувание означает, что мы преобразовываем xml в объекты представления, чтобы его можно было отобразить, для этого нам нужен сервис, называемый службой надувания макета и дайте ему XML, и он будет преобразован для вас.

черный ястреб
источник