Что делает LayoutInflater в Android?

Какая польза от LayoutInflater в Android?


person user386430    schedule 13.08.2010    source источник
comment
Проверьте, это Одно помогает.   -  person Bertram Gilfoyle    schedule 07.08.2018


Ответы (15)


Когда вы используете настраиваемое представление в ListView, вы должны определить макет строки. Вы создаете xml, в котором размещаете виджеты Android, а затем в коде адаптера должны делать что-то вроде этого:

public MyAdapter(Context context, List<MyObject> objects) extends ArrayAdapter {
  super(context, 1, objects);
  /* We get the inflator in the constructor */
  mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View view;
  /* We inflate the xml which gives us a view */
  view = mInflater.inflate(R.layout.my_list_custom_row, parent, false);

  /* Get the item in the adapter */
  MyObject myObject = getItem(position);

  /* Get the widget with id name which is defined in the xml of the row */
  TextView name = (TextView) view.findViewById(R.id.name);

  /* Populate the row's xml with info from the item */
  name.setText(myObject.getName());

  /* Return the generated view */
  return view;
}

Подробнее читайте в официальной документации.

person Macarse    schedule 13.08.2010
comment
В идеале вы должны сначала протестировать convertView, чтобы увидеть, можете ли вы переработать ресурс, поэтому View view = convertView; if (view == null) { view = mInflater.... } - person Jannie Theunissen; 22.03.2013
comment
Я не думаю, что этот ответ действительно объясняет, что такое LayoutInflater, хотя объясняет, где его использовать. Ответ 1-вниз лучше. - person James Ko; 08.06.2017
comment
Это не объясняет, что такое LayoutInflater. Он объясняет, как его использовать. - person Donato; 15.07.2017
comment
Я ищу объяснение LayoutInflater. - person Player1; 02.03.2018
comment
@ Player1 Вы можете проверить это сообщение - person Bertram Gilfoyle; 11.08.2018

Класс LayoutInflater используется для создания экземпляра содержимого макета. XML-файлы в соответствующие им объекты просмотра.

Другими словами, он принимает XML-файл в качестве входных данных и строит из него объекты View.

person Pentium10    schedule 13.08.2010
comment
Другими словами, я искал часть, так как верхняя часть уже есть в документации API. - person Nipuna; 27.07.2011
comment
Мне это все еще кажется довольно абстрактным. Итак, допустим, у меня есть single_list_item.xml файл для каждой строки ListView. Является ли использование этого XML-файла чем-то вроде надувного устройства? - person JohnK; 27.06.2012
comment
Фактически, все документы по API говорят сами за себя. Создание экземпляра содержимого XML - вот точное описание. Иногда мы слишком глубоко вникаем в текст и упускаем из виду очевидное. - person dp2050; 22.12.2020

Что делает LayoutInflator?

Когда я только начал программировать под Android, меня очень сбили с толку LayoutInflater и findViewById. Иногда мы использовали одно, а иногда другое.

  • LayoutInflater используется для создания нового объекта View (или Layout) из одного из ваших макетов xml.
  • findViewById просто дает ссылку на уже созданное представление. Вы можете подумать, что еще не создали никаких представлений, но всякий раз, когда вы вызываете setContentView в onCreate, макет действия вместе с его подпредставлениями раздувается (создается) за кулисами.

Поэтому, если представление уже существует, используйте findViewById. Если нет, то создайте его с LayoutInflater.

Пример

Вот созданный мной мини-проект, демонстрирующий как LayoutInflater, так и findViewById в действии. Без специального кода макет выглядит так.

введите описание изображения здесь

Синий квадрат - это настраиваемый макет, вставленный в основной макет с помощью include (подробнее см. здесь). Он был раздут автоматически, поскольку является частью представления содержимого. Как видите, в коде нет ничего особенного.

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Теперь давайте раздуваем (создаем) еще одну копию нашего настраиваемого макета и добавляем ее.

введите описание изображения здесь

LayoutInflater inflater = getLayoutInflater();
View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false);

Чтобы расширить новый макет представления, все, что я сделал, это сказал надувному модулю имя моего xml-файла (my_layout), родительского макета, в который я хочу добавить его (mainLayout), и что я на самом деле еще не хочу его добавлять. (false). (Я также мог бы установить для родителя значение null, но тогда параметры макета корневого представления моего настраиваемого макета будут проигнорированы.)

И снова в контексте.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // inflate the main layout for the activity
        setContentView(R.layout.activity_main);

        // get a reference to the already created main layout
        LinearLayout mainLayout = (LinearLayout) findViewById(R.id.activity_main_layout);

        // inflate (create) another copy of our custom layout
        LayoutInflater inflater = getLayoutInflater();
        View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false);

        // make changes to our custom layout and its subviews
        myLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorAccent));
        TextView textView = (TextView) myLayout.findViewById(R.id.textView);
        textView.setText("New Layout");

        // add our custom layout to the main layout
        mainLayout.addView(myLayout);
    }
}

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

Дополнительный код

Вот xml для примера выше.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main_layout"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <!-- Here is the inserted layout -->
    <include layout="@layout/my_layout"/>

</LinearLayout>

my_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="@color/colorPrimary">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:padding="5dp"
        android:textColor="@android:color/white"
        android:text="My Layout"/>

</RelativeLayout>

Когда вам нужен LayoutInflater

  • Чаще всего люди используют его в RecyclerView. (См. Эти RecyclerView примеры для списка или сетку.) Вам необходимо создать новый макет для каждого отдельного видимого элемента в списке или сетке.
  • Вы также можете использовать надувной макет, если у вас есть сложный макет, который вы хотите добавить программно (как мы это сделали в нашем примере). Вы можете сделать все это в коде, но гораздо проще сначала определить это в xml, а затем просто раздуть его.
person Suragch    schedule 06.01.2017
comment
Гораздо лучшее объяснение, чем ответ, помеченный как решение. Иногда жизнь просто несправедлива. - person Steve Wellens; 12.04.2018
comment
Здравствуйте, сэр! Если у меня более одного представления в main_activity.xml, то как я могу установить представление external.xml в main_activity с центром layout_gravity. - person Prince Dholakiya; 27.08.2018
comment
Это должен быть принятый ответ. Так легко понять любому новичку. - person Mr Cold; 06.06.2019
comment
Mylayout - это тип представления или тип LinearLayout? - person HS Singh; 06.10.2019
comment
@HSSingh, myLayout - это представление, хотя я мог бы добавить его как RelativeLayout (см. My_layout.xml). После того, как он раздувается, я добавляю его как часть родительского элемента LinearLayout (то есть mainLayout). - person Suragch; 07.10.2019
comment
удивительное объяснение. реквизит для вас - person CodingChap; 01.01.2021

LayoutInflater.inflate () предоставляет средства для преобразования файла res / layout / *. Xml, определяющего представление, в реальный объект View, который можно использовать в исходном коде вашего приложения.

два основных шага: получить надувной аппарат, а затем надуть ресурс

Как получить надувной насос?

LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

Как получить представление, если xml-файл - "list_item.xml"?

View view = inflater.inflate(R.layout.list_item, parent, false);
person Scott Hellam    schedule 16.03.2014

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

Предположим, что ваш макет строки ListView может иметь переменное количество TextView. Итак, сначала вы раздуваете базовый элемент View (как и в предыдущем примере), а затем в цикле динамически добавляете TextView во время выполнения. Использование android: layout_weight дополнительно все идеально выравнивает.

Вот ресурсы по макетам:

list_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" >
    <TextView 
        android:id="@+id/field1"
        android:layout_width="0dp"  
        android:layout_height="wrap_content" 
        android:layout_weight="2"/>
    <TextView 
        android:id="@+id/field2"
        android:layout_width="0dp"  
        android:layout_height="wrap_content" 
        android:layout_weight="1"
/>
</LinearLayout>

schedule_layout.xml

<?xml version="1.0" encoding="utf-8"?>
   <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dp"  
    android:layout_height="wrap_content" 
    android:layout_weight="1"/>

Переопределить метод getView в расширении класса BaseAdapter

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = activity.getLayoutInflater();
    View lst_item_view = inflater.inflate(R.layout.list_layout, null);
    TextView t1 = (TextView) lst_item_view.findViewById(R.id.field1);
    TextView t2 = (TextView) lst_item_view.findViewById(R.id.field2);
    t1.setText("some value");
    t2.setText("another value");

    // dinamically add TextViews for each item in ArrayList list_schedule
    for(int i = 0; i < list_schedule.size(); i++){
        View schedule_view = inflater.inflate(R.layout.schedule_layout, (ViewGroup) lst_item_view, false);
        ((TextView)schedule_view).setText(list_schedule.get(i));
        ((ViewGroup) lst_item_view).addView(schedule_view);
    }
    return lst_item_view;
}

Обратите внимание на различные вызовы методов inflate:

inflater.inflate(R.layout.list_layout, null); // no parent
inflater.inflate(R.layout.schedule_layout, (ViewGroup) lst_item_view, false); // with parent preserving LayoutParams
person MSquare    schedule 22.12.2012

Этот класс используется для создания экземпляра XML-файла макета в его соответствующих View объектах. Он никогда не используется напрямую - используйте getLayoutInflater() или getSystemService(String) для получения стандартного LayoutInflater экземпляра, который уже подключен к текущему контексту и правильно настроен для устройства, на котором вы работаете. Например:

LayoutInflater inflater = (LayoutInflater)context.getSystemService
      (Context.LAYOUT_INFLATER_SERVICE);

Ссылка: http://developer.android.com/reference/android/view/LayoutInflater.html

person Abhishek Singh Rathaur    schedule 03.03.2012
comment
Это может быть правдой, но не отвечает на вопрос. - person Sinthia V; 15.10.2013

Наполнение означает чтение XML-файла, описывающего макет (или элемент графического интерфейса), и создание соответствующих ему объектов, которые, таким образом, делают объект видимым в приложении Android.

final Dialog mDateTimeDialog = new Dialog(MainActivity.this);

// Inflate the root layout
final RelativeLayout mDateTimeDialogView = (RelativeLayout) getLayoutInflater().inflate(R.layout.date_time_dialog, null);

// Grab widget instance
final DateTimePicker mDateTimePicker = (DateTimePicker) mDateTimeDialogView.findViewById(R.id.DateTimePicker);

Этот файл можно сохранить как date_time_dialog.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/DateTimeDialog" android:layout_width="100px"
    android:layout_height="wrap_content">
    <com.dt.datetimepicker.DateTimePicker
            android:id="@+id/DateTimePicker" android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    <LinearLayout android:id="@+id/ControlButtons"
            android:layout_width="fill_parent" android:layout_height="wrap_content"
            android:layout_below="@+id/DateTimePicker"
            android:padding="5dip">
            <Button android:id="@+id/SetDateTime" android:layout_width="0dip"
                    android:text="@android:string/ok" android:layout_weight="1"
                    android:layout_height="wrap_content"
                   />
            <Button android:id="@+id/ResetDateTime" android:layout_width="0dip"
                    android:text="Reset" android:layout_weight="1"
                    android:layout_height="wrap_content"
                    />
            <Button android:id="@+id/CancelDialog" android:layout_width="0dip"
                    android:text="@android:string/cancel" android:layout_weight="1"
                    android:layout_height="wrap_content"
                     />
    </LinearLayout>

This file could saved as date_time_picker.xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content" `enter code here`
    android:padding="5dip" android:id="@+id/DateTimePicker">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:baselineAligned="true"
android:orientation="horizontal">

    <LinearLayout
    android:id="@+id/month_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="1dp"
    android:layout_marginTop="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:gravity="center"
    android:orientation="vertical">
    <Button
        android:id="@+id/month_plus"
        android:layout_width="45dp"
        android:layout_height="45dp"  
        android:background="@drawable/image_button_up_final"/>
    <EditText
        android:id="@+id/month_display"
        android:layout_width="45dp"
        android:layout_height="35dp"
        android:background="@drawable/picker_middle"
        android:focusable="false"
        android:gravity="center"
        android:singleLine="true"
        android:textColor="#000000">
    </EditText>
    <Button
        android:id="@+id/month_minus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
        android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
    android:id="@+id/date_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="0.5dp"
    android:layout_marginTop="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:gravity="center"
    android:orientation="vertical">
    <Button
        android:id="@+id/date_plus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
        android:background="@drawable/image_button_up_final"/>
    <EditText
        android:id="@+id/date_display"
        android:layout_width="45dp"
        android:layout_height="35dp"
        android:background="@drawable/picker_middle"
        android:gravity="center"
        android:focusable="false"
        android:inputType="number"
        android:textColor="#000000"
        android:singleLine="true"/>
    <Button
        android:id="@+id/date_minus"
        android:layout_width="45dp"
        android:layout_height="45dp"      
        android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
    android:id="@+id/year_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="0.5dp"
    android:layout_marginTop="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:gravity="center"
    android:orientation="vertical">
    <Button
        android:id="@+id/year_plus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
            android:background="@drawable/image_button_up_final"/>
    <EditText
        android:id="@+id/year_display"
        android:layout_width="45dp"
        android:layout_height="35dp"
        android:background="@drawable/picker_middle"
        android:gravity="center"
        android:focusable="false"
        android:inputType="number"
        android:textColor="#000000"
        android:singleLine="true"/>
    <Button
        android:id="@+id/year_minus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
        android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
        android:id="@+id/hour_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:gravity="center"
        android:orientation="vertical">
        <Button
            android:id="@+id/hour_plus"
            android:layout_width="45dp"
            android:layout_height="45dp"          
            android:background="@drawable/image_button_up_final"/>
        <EditText
            android:id="@+id/hour_display"
            android:layout_width="45dp"
            android:layout_height="35dp"
            android:background="@drawable/picker_middle"
            android:gravity="center"
            android:focusable="false"
            android:inputType="number"
            android:textColor="#000000"
            android:singleLine="true">
        </EditText>
        <Button
            android:id="@+id/hour_minus"
            android:layout_width="45dp"
            android:layout_height="45dp"       
            android:background="@drawable/image_button_down_final"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/min_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0.35dp"
        android:layout_marginTop="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="5dp"
        android:gravity="center"
        android:orientation="vertical">
        <Button
            android:id="@+id/min_plus"
            android:layout_width="45dp"
            android:layout_height="45dp"       
            android:background="@drawable/image_button_up_final"/>
        <EditText
            android:id="@+id/min_display"
            android:layout_width="45dp"
            android:layout_height="35dp"
            android:background="@drawable/picker_middle"
            android:gravity="center"
            android:focusable="false"
            android:inputType="number"
            android:textColor="#000000"
            android:singleLine="true"/>
        <Button
            android:id="@+id/min_minus"
            android:layout_width="45dp"
            android:layout_height="45dp"       
            android:background="@drawable/image_button_down_final"/>
    </LinearLayout>

    <LinearLayout 
        android:id="@+id/meridiem_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0.35dp"
        android:layout_marginTop="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="5dp"
        android:gravity="center"
        android:orientation="vertical">
        <ToggleButton 
            android:id="@+id/toggle_display"
            style="@style/SpecialToggleButton"
            android:layout_width="40dp"
            android:layout_height="32dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="45dp"
            android:layout_marginRight="5dp"
            android:layout_marginBottom="5dp"
            android:padding="5dp"
            android:gravity="center"
            android:textOn="@string/meridiem_AM"
            android:textOff="@string/meridiem_PM"
            android:checked="true"/>

           <!--  android:checked="true" --> 

    </LinearLayout>
</LinearLayout>
</RelativeLayout>

Класс MainActivity, сохраненный как MainActivity.java:

public class MainActivity extends Activity {
    EditText editText;
    Button button_click;
    public static Activity me = null;
    String meridiem;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText)findViewById(R.id.edittext1);
        button_click = (Button)findViewById(R.id.button1);
        button_click.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view){
                final Dialog mDateTimeDialog = new Dialog(MainActivity.this);
                final RelativeLayout mDateTimeDialogView = (RelativeLayout)   getLayoutInflater().inflate(R.layout.date_time_dialog, null);
                final DateTimePicker mDateTimePicker = (DateTimePicker) mDateTimeDialogView.findViewById(R.id.DateTimePicker);
                // mDateTimePicker.setDateChangedListener();
                ((Button) mDateTimeDialogView.findViewById(R.id.SetDateTime)).setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        mDateTimePicker.clearFocus();
                        int hour = mDateTimePicker.getHour();
                        String result_string = mDateTimePicker.getMonth() +" "+   String.valueOf(mDateTimePicker.getDay()) + ", " + String.valueOf(mDateTimePicker.getYear())
                        + "  " +(mDateTimePicker.getHour()<=9? String.valueOf("0"+mDateTimePicker.getHour()) : String.valueOf(mDateTimePicker.getHour())) + ":" + (mDateTimePicker.getMinute()<=9?String.valueOf("0"+mDateTimePicker.getMinute()):String.valueOf(mDateTimePicker.getMinute()))+" "+mDateTimePicker.getMeridiem();
                        editText.setText(result_string);
                        mDateTimeDialog.dismiss();
                    }
                });
                // Cancel the dialog when the "Cancel" button is clicked
                ((Button) mDateTimeDialogView.findViewById(R.id.CancelDialog)).setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        mDateTimeDialog.cancel();
                    }
                });
                // Reset Date and Time pickers when the "Reset" button is clicked
                ((Button) mDateTimeDialogView.findViewById(R.id.ResetDateTime)).setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        mDateTimePicker.reset();
                    }
                });

                // Setup TimePicker
                // No title on the dialog window
                mDateTimeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                // Set the dialog content view
                mDateTimeDialog.setContentView(mDateTimeDialogView);
                // Display the dialog
                mDateTimeDialog.show();
            }
        });
    }
}
person Jijo    schedule 23.09.2014

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/layout1"
    >
<TextView
        android:id="@+id/namelabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enter your name"
        android:textAppearance="?android:attr/textAppearanceLarge" >
    </TextView>
    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="14dp"
        android:ems="10">
    </EditText>
</LinearLayout>

Мы можем отобразить этот макет статическим образом,

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

Динамический способ создания представления означает, что представление не упоминается в нашем main.xml, но мы хотим показать это во время выполнения. Например, у нас есть еще один XML в папке макета как footer.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/TextView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="Add your record"
    android:textSize="24sp" >
 </TextView>

Мы хотим отображать это текстовое поле во время выполнения в нашем основном пользовательском интерфейсе. Итак, здесь мы раздуваем text.xml. Смотри как:

public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  final LayoutInflater  inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  TextView t = (TextView)inflater.inflate(R.layout.footer,null);

  lLayout = (LinearLayout)findViewById(R.id.layout1);
  lLayout.addView(t);

Здесь я использовал getSystemService (String) для получения экземпляра LayoutInflater. Я также могу использовать getLayoutInflator () для надувания вместо использования getSystemService (String), как показано ниже:

LayoutInflator inflater = getLayoutInflater();
TextView t = (TextView) inflater.inflate(R.layout.footer, null);
lLayout.addView(t);
person Arry    schedule 04.03.2019

Что делает надувной элемент

Он принимает в качестве входных данных макет xml (скажем) и преобразует его в объект View.

Зачем нужно

Давайте представим сценарий, в котором нам нужно создать настраиваемое представление списка. Теперь каждая строка должна быть индивидуальной. Но как это сделать. Невозможно назначить XML-макет строке списка. Итак, мы создаем объект View. Таким образом, мы можем получить доступ к элементам в нем (textview, imageview и т. Д.), А также назначить объект как строку списка

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

person Zahan Safallwa    schedule 02.02.2016
comment
Итак, мистер Захан, это похоже на DOM в Javascript? • o • - person Jeancarlo Fontalvo; 25.12.2016

вот пример получения ссылки для корневого представления макета, его раздувания и использования с setContentView (представление представления)

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LayoutInflater li=getLayoutInflater();
    View rootView=li.inflate(R.layout.activity_main,null);
    setContentView(rootView);


}
person Gal Rom    schedule 07.01.2014

LayoutInflater создает объекты View на основе макетов, определенных в XML. Существует несколько различных способов использования LayoutInflater, включая создание пользовательских представлений, преобразование представлений фрагментов в представления действий, создание диалогов или просто расширение представления файла макета в действие.

Есть много неправильных представлений о том, как работает процесс инфляции. Я думаю, это связано с плохой документацией по методу inflate (). Если вы хотите подробнее узнать о методе inflate (), я написал об этом в блоге здесь:

https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/

person seanjfarrell    schedule 19.02.2016

Layout Inflater - это класс, который считывает описание внешнего вида в формате xml и преобразует их в объекты View на основе Java.

person Muhammed Shibin    schedule 01.07.2016

мой список настроек надеюсь, что он проиллюстрирует концепцию

public class second extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
//  TextView textview=(TextView)findViewById(R.id.textView1);
//  textview.setText(getIntent().getExtras().getString("value"));

    setListAdapter(new MyAdapter(this,R.layout.list_item,R.id.textView1, getResources().getStringArray(R.array.counteries)));
}

private class MyAdapter extends ArrayAdapter<String>{

    public MyAdapter(Context context, int resource, int textViewResourceId,
            String[] objects) {
        super(context, resource, textViewResourceId, objects);
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row=inflater.inflate(R.layout.list_item,parent,false);
        String[]items=getResources().getStringArray(R.array.counteries);

        ImageView iv=(ImageView) row.findViewById(R.id.imageView1);
        TextView tv=(TextView) row.findViewById(R.id.textView1);
        tv.setText(items[position]);

        if(items[position].equals("unitedstates")){
            iv.setImageResource(R.drawable.usa);
        }else   if(items[position].equals("Russia")){
            iv.setImageResource(R.drawable.russia);
        }else   if(items[position].equals("Japan")){
            iv.setImageResource(R.drawable.japan);
        }
        // TODO Auto-generated method stub
        return row;
    }

}

}
person Moustafa Bayommy    schedule 20.09.2015

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

person vishwas    schedule 19.01.2016

Inflater на самом деле своего рода преобразование в данные, представления, экземпляры, в видимое представление пользовательского интерфейса ... .. Таким образом, он программно использует поток данных из адаптеров и т. Д. затем интегрируя его с определенным вами xml, который сообщает ему, как данные должны быть представлены в пользовательском интерфейсе

person Community    schedule 26.09.2016