Apa yang dilakukan dengan LayoutInflater di Android?


Jawaban:


164

Saat Anda menggunakan tampilan khusus di, ListViewAnda harus menentukan tata letak baris. Anda membuat xml tempat Anda meletakkan widget android dan kemudian dalam kode adaptor Anda harus melakukan sesuatu seperti ini:

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

Baca lebih lanjut di dokumentasi resmi .


23
Idealnya, Anda harus terlebih dahulu menguji convertView untuk melihat apakah Anda dapat mendaur ulang sumber daya, jadiView view = convertView; if (view == null) { view = mInflater.... }
Jannie Theunissen

13
Saya tidak berpikir jawaban ini benar-benar menjelaskan apa LayoutInflateritu, meskipun menjelaskan di mana menggunakannya. Jawaban 1-bawah lebih baik.
James Ko

5
Ini tidak menjelaskan apa itu LayoutInflater. Ini menjelaskan cara menggunakannya.
Donato

2
Saya mencari penjelasan tentang LayoutInflater.
Player1

@ Player1 Anda dapat memeriksa pos ini
Bertram Gilfoyle

284

Kelas LayoutInflater digunakan untuk instantiate isi file XML layout ke objek View yang sesuai.

Dengan kata lain, dibutuhkan file XML sebagai input dan membangun objek View darinya.


74
Apa yang saya cari adalah bagian "dengan kata lain" karena bagian atas sudah ada di API docs
Nipuna

1
Ini masih terasa cukup abstrak bagi saya. Jadi, katakanlah saya memiliki single_list_item.xmlfile untuk setiap baris a ListView. Apakah penggunaan file XML itu seperti inflater?
JohnK

169

Apa yang LayoutInflatorharus dilakukan

Ketika saya pertama kali memulai pemrograman Android, saya benar-benar bingung oleh LayoutInflaterdan findViewById. Terkadang kami menggunakan satu dan terkadang yang lain.

  • LayoutInflaterdigunakan untuk membuat objek baru View(atau Layout) dari salah satu tata letak xml Anda.
  • findViewByIdhanya memberi Anda referensi ke tampilan daripada yang telah dibuat. Anda mungkin berpikir bahwa Anda belum membuat pandangan, tapi setiap kali Anda menelepon setContentViewdi onCreate, tata letak aktivitas bersama dengan subviews nya akan meningkat (diciptakan) di belakang layar.

Jadi jika tampilan sudah ada, maka gunakan findViewById. Jika tidak, maka buatlah dengan a LayoutInflater.

Contoh

Ini adalah proyek mini yang saya buat yang menunjukkan keduanya LayoutInflaterdan findViewByIdsedang beraksi. Tanpa kode khusus, tata letaknya seperti ini.

masukkan deskripsi gambar di sini

Kotak biru adalah tata letak khusus dimasukkan ke dalam tata letak utama dengan include(lihat di sini untuk lebih lanjut). Itu meningkat secara otomatis karena itu adalah bagian dari tampilan konten. Seperti yang Anda lihat, tidak ada yang spesial dari kode ini.

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

Sekarang mari kita mengembang (membuat) salinan tata letak khusus kita dan menambahkannya.

masukkan deskripsi gambar di sini

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

Untuk mengembang tata letak tampilan baru, semua yang saya lakukan adalah memberi tahu inflater nama file xml saya ( my_layout), tata letak induk yang ingin saya tambahkan ( mainLayout), dan bahwa saya sebenarnya belum ingin menambahkannya ( false) . (Saya juga bisa mengatur induk ke null, tetapi kemudian parameter tata letak tampilan root tata letak kustom saya akan diabaikan.)

Ini lagi dalam konteks.

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

Perhatikan bagaimana findViewByIddigunakan hanya setelah tata letak telah meningkat.

Kode Tambahan

Berikut ini adalah xml untuk contoh di atas.

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>

Kapan Anda membutuhkan LayoutInflater

  • Waktu yang paling umum digunakan kebanyakan orang adalah dalam RecyclerView. (Lihat RecyclerViewcontoh - contoh ini untuk daftar atau kisi .) Anda harus mengembang tata letak baru untuk setiap item yang terlihat dalam daftar atau kisi.
  • Anda juga dapat menggunakan inflater tata letak jika Anda memiliki tata letak rumit yang ingin Anda tambahkan secara programatis (seperti yang kami lakukan pada contoh kami). Anda bisa melakukan semuanya dalam kode, tetapi lebih mudah untuk mendefinisikannya dalam xml terlebih dahulu dan kemudian mengembang saja.

22
Penjelasan yang jauh lebih baik daripada jawaban yang ditandai sebagai solusi. Terkadang hidup tidak adil.
Steve Wellens

Halo pak, Jika saya memiliki lebih dari satu tampilan di main_activity.xml, lalu bagaimana cara mengatur tampilan external.xml di main_activity dengan center layout_gravity.
Pangeran

1
Ini harus menjadi jawaban yang diterima. Sangat mudah dimengerti untuk pemula.
Tuan Cold

Apakah mylayout adalah tipe View atau tipe LinearLayout?
HS Singh

@ HSSingh, myLayoutadalah View, meskipun saya bisa menggelembungkannya sebagai RelativeLayout (lihat my_layout.xml). Setelah meningkat saya menambahkannya sebagai subview dari induk LinearLayout (yaitu, mainLayout).
Suragch

31

LayoutInflater.inflate () menyediakan sarana untuk mengonversi file res / layout / *. Xml yang mendefinisikan tampilan menjadi objek Tampilan aktual yang dapat digunakan dalam kode sumber aplikasi Anda.

dasar dua langkah: ambil inflater dan kemudian kembangkan sumber daya

Bagaimana Anda mendapatkan inflater?

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

Bagaimana Anda mendapatkan tampilan dengan asumsi file xml adalah "list_item.xml"?

View view = inflater.inflate(R.layout.list_item, parent, false);

22

Berikut adalah contoh lain yang mirip dengan yang sebelumnya, tetapi diperluas untuk lebih menunjukkan parameter mengembang dan perilaku dinamis yang dapat diberikan.

Misalkan tata letak baris ListView Anda dapat memiliki jumlah variabel TextViews. Jadi pertama-tama Anda mengembang tampilan item dasar (seperti contoh sebelumnya), dan kemudian loop secara dinamis menambahkan TextViews pada saat run-time. Menggunakan android: layout_weight juga meluruskan segalanya dengan sempurna.

Berikut adalah sumber daya Tata Letak:

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"/>

Mengganti metode getView dalam ekstensi kelas 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;
}

Perhatikan panggilan metode mengembang yang berbeda:

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

Kelas ini digunakan untuk instantiate tata letak file XML ke Viewobjek yang sesuai . Itu tidak pernah digunakan secara langsung - gunakan getLayoutInflater()atau getSystemService(String)untuk mengambil LayoutInflatercontoh standar yang sudah terhubung ke konteks saat ini dan dikonfigurasi dengan benar untuk perangkat yang Anda jalankan. Sebagai contoh:

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

Referensi: http://developer.android.com/reference/android/view/LayoutInflater.html


2
Ini mungkin benar tetapi tidak menjawab pertanyaan.
Sinthia V

8

Menggembungkan berarti membaca file XML yang menggambarkan tata letak (atau elemen GUI) dan untuk membuat objek aktual yang sesuai dengannya, dan dengan demikian membuat objek tersebut terlihat dalam aplikasi 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);

File ini dapat disimpan sebagai 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>

File ini dapat disimpan sebagai 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>

The MainActivitykelas disimpan sebagai 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

Apa yang inflater lakukan?

Dibutuhkan tata letak xml sebagai input (katakanlah) dan mengubahnya menjadi objek Lihat.

Mengapa dibutuhkan

Mari kita pikirkan skenario di mana kita perlu membuat tampilan daftar kustom. Sekarang setiap baris harus dibuat khusus. Tetapi bagaimana kita bisa melakukannya. Tidak mungkin untuk menetapkan tata letak xml ke deretan tampilan daftar. Jadi, kami membuat objek View. Dengan demikian kita dapat mengakses elemen di dalamnya (tampilan teks, tampilan gambar dll) dan juga menetapkan objek sebagai deretan tampilan daftar

Jadi, setiap kali kita perlu menetapkan objek jenis tampilan di suatu tempat dan kami memiliki desain xml kustom kami, kami hanya mengubahnya ke objek oleh inflater dan menggunakannya.


Jadi, Tuan Zahan, apakah ini seperti DOM dalam Javascript? • o •
Jeancarlo Fontalvo

6

LayoutInflater adalah kelas yang digunakan untuk instantiate file XML layout ke objek tampilan terkait yang dapat digunakan dalam program Java. Secara sederhana, ada dua cara untuk membuat UI di android. Yang satu adalah cara statis dan yang lainnya dinamis atau terprogram. Misalkan kita memiliki tata letak sederhana main.xml memiliki satu textviewdan satu edittextsebagai berikut.

<?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>

Kita dapat menampilkan tata letak ini dengan cara statis

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

Cara dinamis membuat tampilan berarti tampilan tidak disebutkan dalam main.xml kami, tetapi kami ingin menampilkannya dalam waktu berjalan. Misalnya, kami memiliki folder tata letak XML lain sebagai 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>

Kami ingin menampilkan kotak teks ini dalam jangka waktu dalam UI utama kami. Jadi di sini kita akan mengembang text.xml. Lihat bagaimana:

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

Di sini saya telah menggunakan getSystemService (String) untuk mengambil contoh LayoutInflater. Saya juga bisa menggunakan getLayoutInflator () untuk mengembang daripada menggunakan getSystemService (String) seperti di bawah ini:

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

5

di sini adalah contoh untuk mendapatkan referensi untuk tampilan root dari tata letak, menggembungkannya dan menggunakannya dengan setContentView (tampilan tampilan)

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 adalah kelas yang membaca deskripsi penampilan xml dan mengubahnya menjadi objek tampilan berbasis java.


0

daftar penyesuaian saya harap ini menggambarkan konsep

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 adalah komponen mendasar dalam Android. Anda harus menggunakannya setiap saat untuk mengubah file xml menjadi hierarki tampilan.


0

LayoutInflater membuat objek View berdasarkan tata letak yang didefinisikan dalam XML. Ada beberapa cara berbeda untuk menggunakan LayoutInflater, termasuk membuat Tampilan kustom, menggembungkan tampilan Fragmen ke dalam tampilan Aktivitas, membuat Dialog, atau hanya menggembungkan tampilan file tata letak ke dalam suatu Aktivitas.

Ada banyak kesalahpahaman tentang bagaimana proses inflasi bekerja. Saya pikir ini berasal dari buruknya dokumentasi untuk metode mengembang (). Jika Anda ingin mempelajari tentang metode mengembang () secara rinci, saya menulis posting blog di sini:

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


0

Inflater sebenarnya semacam konversi ke data, tampilan, contoh, untuk representasi UI yang terlihat ... ..ini memanfaatkan umpan data dari dari mungkin adaptor, dll. Secara terprogram. kemudian mengintegrasikannya dengan xml yang Anda tetapkan, yang memberi tahu bagaimana data harus diwakili di UI

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.