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


Ответы:


164

Когда вы используете пользовательское представление в a, 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;
}

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


23
В идеале вы должны сначала протестировать convertView, чтобы увидеть, можете ли вы утилизировать ресурс, поэтомуView view = convertView; if (view == null) { view = mInflater.... }
Jannie Theunissen,

13
Я не думаю, что этот ответ действительно объясняет, что это LayoutInflaterтакое, хотя и объясняет, где его использовать. Ответ 1 вниз лучше.
Джеймс Ко

5
Это не объясняет, что такое LayoutInflater. Это объясняет, как его использовать.
Донато

2
Я ищу объяснение LayoutInflater.
Игрок

@ Player1 Вы можете проверить это сообщение
Бертрам Гилфойл

284

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

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


75
То, что я искал, это часть «другими словами», так как верхняя часть уже находится в документации по API
Nipuna

1
Это все еще кажется мне довольно абстрактным. Итак, допустим, у меня есть single_list_item.xmlфайл для каждой строки ListView. Является ли использование этого файла XML чем-то вроде инфлятора?
JohnK

169

Что делает 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, а затем просто надуть его.

22
Намного лучше объяснение, чем ответ, помеченный как решение. Иногда жизнь просто не справедлива.
Стив Велленс

Здравствуйте, сэр, если у меня есть больше одного представления в main_activity.xml, то как я могу установить представление external.xml в main_activity с center layout_gravity.
Принц

1
Это должен быть принятый ответ. Так легко понять для любого начинающего.
Мистер Холод

Является ли mylayout типом представления или типом LinearLayout?
HS Singh

@HSSingh, myLayoutэто представление, хотя я мог бы раздувать его как RelativeLayout (см. My_layout.xml). После того, как он надут, я добавляю его как подпредставление родителя LinearLayout (то есть mainLayout).
Сурагч

31

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);

22

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

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

Вот ресурсы Layouts:

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

12

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

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

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


2
Это может быть правдой, но не отвечает на вопрос.
Синтия V

8

Раздувание означает чтение 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>

Этот файл может быть сохранен как 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();
            }
        });
    }
}

6

Что делает инфлятор

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

Зачем нужен

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

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


Итак, мистер Захан, это как DOM в Javascript? • o •
Jeancarlo Fontalvo

6

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);

5

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

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


}

1

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


0

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

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;
    }

}

}

0

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


0

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

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

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.