Що робить LayoutInflater в Android?


Відповіді:


165

Під час використання спеціального перегляду в 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

12
Я не думаю, що ця відповідь насправді пояснює, що LayoutInflaterтаке, хоча це пояснює, де його використовувати. Відповідь 1-вниз краще.
Джеймс Ко

4
Це не пояснює, що таке LayoutInflater. Це пояснює, як ним користуватися.
Донато

1
Я шукаю пояснення LayoutInflater.
Гравець1

@ Player1 Ви можете перевірити це повідомлення
Бертрам Гілфойл

282

Клас LayoutInflater використовується для інстанцізації вмісту XML-файлів макета у відповідні їм об'єкти View.

Іншими словами, він приймає XML-файл як вхідний і будує з нього об’єкти View.


74
Що я шукав, це частина "іншими словами", оскільки верхня частина вже в документах API
Ніпуна

1
Це все ще здається мені досить абстрактним. Скажімо, у мене є single_list_item.xmlфайл для кожного рядка ListView. Чи використання цього XML-файла схоже на надувний?
ДжонК

167

Що робить 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, а потім просто надути.

20
Значно, набагато краще пояснення, ніж відповідь, позначена як рішення. Іноді життя просто не чесне.
Стів Велленс

Привіт, сер, якщо у мене більше одного перегляду в main_activity.xml, то як я можу встановити зовнішній вигляд.xml у main_activity з центром layout_gravity.
Принц

Це має бути прийнятою відповіддю. Так легко зрозуміти для будь-яких новачків.
Містер Холодний

Чи тип mylayout тип перегляду чи тип LinearLayout?
HS Singh

@HSSingh, myLayoutце погляд, хоча я міг би його завищити як відносний макет (див. 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 може мати змінну кількість TextView. Отже, спочатку ви надуваєте базовий елемент View (як і попередній приклад), а потім циклічно динамічно додаючи TextViews під час виконання. Використання 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>

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

Зверніть увагу на різні виклики методу надуття:

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, який описує макет (або елемент GUI) та створення фактичних об'єктів, які відповідають йому, і таким чином роблять об’єкт видимим у додатку для 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. Таким чином, ми можемо отримати доступ до елементів в ньому (перегляд тексту, перегляд зображень тощо), а також призначити об'єкт як рядок перегляду списку

Отже, кожного разу, коли нам потрібно призначити об’єкт типу перегляду десь і у нас є власний дизайн XML, ми просто перетворимо його на об'єкт надувом і використовуємо його.


Отже, містере Захане, це як DOM у Javascript? • o •
Жанкарло Фонталво

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 (Перегляд подання)

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


}

1

Надувний макет - це клас, який читає опис зовнішності 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 створює перегляд об'єктів на основі макетів, визначених у XML. Існує кілька різних способів використання LayoutInflater, включаючи створення спеціальних представлень даних, роздування фрагментів подань у представленнях діяльності, створення діалогових вікон або просто надування файла макета Перегляд у діяльність.

Існує маса помилок щодо того, як працює процес інфляції. Я думаю, що це пов'язано з недостатньою документацією для методу inflate (). Якщо ви хочете детально дізнатися про метод inflate (), я написав про це повідомлення в блозі тут:

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


0

Надуваючи фактично якесь перетворення в дані, перегляди, екземпляри, у видиме представлення користувальницького інтерфейсу. потім інтегруючи його з визначеним вами xml, який говорить про те, як дані повинні бути представлені в інтерфейсі користувача

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.