LayoutInflater (perkhidmatan susun atur)


Pengenalan kepada bahagian ini:

Bahagian ini terus memperkenalkan LayoutInflater (perkhidmatan susun atur) dalam perkhidmatan sistem Android, semua orang adalah yang pertama Perkara yang anda fikirkan ialah menulis xml susun atur, kemudian panggil Activity's setContentView() untuk memuatkan reka letak, dan kemudian paparkannya Pada skrin, bukan? Malah, lapisan bawah masih LayoutInflater, yang dihuraikan menggunakan penghurai Tarik terbina dalam Android. susun atur. Secara amnya, ia lebih biasa digunakan dalam Android untuk memuatkan reka letak atau menambah kawalan secara dinamik Dalam bahagian ini, kita akan mempelajari cara menggunakannya dalam pembangunan sebenar. Beberapa penggunaan~

Dokumen API Rasmi:LayoutInflater


Pengenalan berkaitan LayoutInflater


1) Apa itu Layout?

Jawapan: Perkhidmatan sistem yang digunakan untuk memuatkan reka letak adalah untuk menjadikan objek Lihat yang sepadan dengan fail XML Reka Letak Ia tidak boleh digunakan secara langsung. Anda perlu menggunakan kaedah getLayoutInflater() atau kaedah getSystemService() untuk mendapatkan kandungan terikat pada Konteks semasa Contoh Tata Letak dua sebenarnya menggunakan kaedah pertama di bahagian bawah~


②Kaedah memuatkan susun atur

:

Pandangan awam inflate

(int resource, ViewGroup root, boolean attachToRoot) Tiga parameter kaedah ini ialah:

①Id sumber yang sepadan dengan reka letak yang akan dimuatkan

② Sarang lapisan lain bagi reka letak induk di luar reka letak Jika tidak diperlukan, tulis Null tidak mengapa!

③ Sama ada hendak menetapkan reka letak akar sebagai lapisan paling luar bagi fail reka letak yang dimuatkan Jika parameter ini tidak ditetapkan, Jika root bukan null, ia lalai kepada true Jika root adalah null, attachToRoot tidak mempunyai kesan! Jika root bukan null dan attachToRoot adalah benar, susun atur akar akan bersarang di lapisan paling luar fail susun atur yang dimuatkan; Jika ia palsu, root akan kehilangan fungsinya! Pemahaman mudahnya ialah:
Sama ada hendak menambah bekas luar akar untuk susun atur yang dimuatkan~!

③Tetapkan atribut berkaitan melalui LayoutInflater.LayoutParams

:

Sebagai contoh, RelativeLayout juga boleh menambah peraturan melalui kaedah addRule, iaitu menetapkan kedudukan: adakah ia merujuk kepada bekas induk? Atau rujuk kepada kawalan kanak-kanak? Atau tetapkan margin, dsb., terpulang kepada anda~


2. apa yang kita perlukan susun atur, tetapi dalam beberapa kes tertentu kita Kami perlu menggunakan kod Java untuk menambahkan komponen atau susun atur secara dinamik pada susun atur kami!

Tetapi tidak digalakkan anda menggunakan kod Java sepenuhnya untuk menulis reka letak halaman Android Perkara pertama ialah terdapat banyak kod. Ia mudah untuk dikacau dan tidak sesuai untuk pemisahan perniagaan Kami masih mengesyorkan menggunakan xml untuk melengkapkan reka letak, dan kemudian lulus Kod Java mengubah suai komponen di dalamnya Sudah tentu, kadangkala anda mungkin perlu menggunakan Java untuk menambah komponen secara dinamik.

Proses susun atur pemuatan kod Java tulen:


——Langkah 1:

Cipta bekas:LinearLayout ly = LinearLayout(ini);

Buat komponen:Butang btnOne = Butang baharu(ini);

— — Langkah 2:

Anda boleh menetapkan sifat berkaitan untuk bekas atau komponen: Contohnya: LinearLayout, kita boleh menetapkan arah susunan komponen: ly.setOrientation(LinearLayout.VERTICAL);Dan komponen itu juga boleh: Contohnya, Butang: btnOne.setText("Button 1");Untuk kaedah menetapkan atribut, sila rujuk API Android Biasanya, atribut yang ditetapkan dalam xml hanya perlu ditambah di hadapan: set, seperti . setPadding (kiri, atas, kanan, bawah) ;

——Langkah 3:

Tambah komponen atau bekas ke dalam bekas mungkin perlu menetapkan kedudukan penambahan komponen, atau tetapkan saiznya : Kita perlu menggunakan kelas: LayoutParams, kita boleh menganggapnya sebagai pakej maklumat bagi kedudukan dan saiz Enkapsulasi Kelas menunggu maklumat! Mula-mula menunjukkan kaedah menetapkan saiz: (Layout Linear sebelumnya boleh diubah mengikut bekas yang berbeza)

LayoutInflater inflater1 = LayoutInflater.from(this);  
LayoutInflater inflater2 = getLayoutInflater();  
LayoutInflater inflater3 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

adalah sangat mudah, dan kemudian datang ke kedudukan tetapan , kami biasanya menganggap Ia hanya RelativeLayout! Pada masa ini, kaedah addRule() LayoutParams digunakan Anda boleh menambah berbilang addRule()! Tetapkan kedudukan komponen dalam bekas induk,

Sebagai contoh, Tetapkan kaedah penjajaran komponen:

LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams(  
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

Rujuk kaedah penjajaran bagi komponen lain: (Satu kelemahan ialah anda perlu menetapkan id secara manual untuk komponen rujukan, iaitu secara manual!!!!) Contohnya: Selepas menetapkan btnOne untuk dipusatkan, biarkan BtnTwo terletak di bawah btnOne dan di sebelah kanan bekas induk

RelativeLayout rly = new RelativeLayout(this);  
RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(  
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
lp2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);  
Button btnOne = new Button(this);  
rly.addView(btnOne, lp2);

——langkah 4:

Panggil! kaedah setContentView() untuk memuatkan susun atur Hanya objek! Selain itu, jika anda ingin mengalih keluar View dalam bekas, anda boleh memanggil bekas itu.removeView(komponen untuk dialih keluar);

Jalankan tangkapan skrin:

1.png


3. Kod Java secara dinamik menambah kawalan atau susun atur xml

Perkara kedua yang kami jelaskan ialah menggunakan kod Java tulen untuk memuatkan susun atur. Malah, Ia tidak banyak digunakan, lebih kerap ia dinamik. Tambah kawalan Lihat dan muatkan susun atur XML secara dinamik!

1) Kod Java secara dinamik menambah View

Terdapat dua cara untuk menambah komponen secara dinamik Perbezaannya ialah sama ada anda perlu terlebih dahulu setContentView(. R.layout .activity_main); Berikut menunjukkan dua kaedah penulisan berbeza untuk menambah Butang:

Tulis fail susun atur dahulu: activity_main.xml:

public class MainActivity extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        RelativeLayout rly = new RelativeLayout(this);  
        Button btnOne = new Button(this);  
        btnOne.setText("按钮1");  
        Button btnTwo = new Button(this);  
        btnTwo.setText("按钮2");  
        // 为按钮1设置一个id值  
        btnOne.setId(123);  
        // 设置按钮1的位置,在父容器中居中  
        RelativeLayout.LayoutParams rlp1 = new RelativeLayout.LayoutParams(  
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
        rlp1.addRule(RelativeLayout.CENTER_IN_PARENT);  
        // 设置按钮2的位置,在按钮1的下方,并且对齐父容器右面  
        RelativeLayout.LayoutParams rlp2 = new RelativeLayout.LayoutParams(  
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
        rlp2.addRule(RelativeLayout.BELOW, 123);  
        rlp2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);  
        // 将组件添加到外部容器中  
        rly.addView(btnTwo, rlp2);  
        rly.addView(btnOne, rlp1);  
        // 设置当前视图加载的View即rly  
        setContentView(rly);  
    }  
}

Kaedah pertama bukan SetContentView () diperlukan untuk memuatkan fail susun atur dahulu:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/RelativeLayout1"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent" >  
  
    <TextView   
        android:id="@+id/txtTitle"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:text="我是xml文件加载的布局"/>  
</RelativeLayout>

Jenis kedua tidak memerlukan setContentView() untuk memuatkan fail susun atur dahulu:

public class MainActivity extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        Button btnOne = new Button(this);  
        btnOne.setText("我是动态添加的按钮");  
        RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(    
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);    
        lp2.addRule(RelativeLayout.CENTER_IN_PARENT);    
        LayoutInflater inflater = LayoutInflater.from(this);  
        RelativeLayout rly = (RelativeLayout) inflater.inflate(  
                R.layout.activity_main, null)  
                .findViewById(R.id.RelativeLayout1);  
        rly.addView(btnOne,lp2);  
        setContentView(rly);  
    }  
}

Ringkasan analisis

Kod ini sangat mudah Selepas mencipta butang, kami mencipta objek LayoutParams untuk menetapkan saiz Butang. Kedudukan Butang ditetapkan melalui kaedah addRule()

Kaedah pertama : Muatkan susun atur activity_main melalui kaedah inflate() LayoutInflate, dan dapatkan bekas luar. Kemudian addView menambah butang ke dalam bekas, dan akhirnya setContentView();

Kaedah kedua: Kerana kami telah memuatkan reka letak melalui kaedah setContetView(), pada masa ini kami boleh lulus findViewById mencari bekas luar, kemudian addView, dan akhirnya setContentView()!

Selain itu, nod paparan yang ditetapkan oleh setContentView() ialah nod akar bagi keseluruhan XML!


2) Kod Java memuatkan susun atur xml secara dinamik

Seterusnya, mari kita ubahnya, kali ini memuatkan fail xml!Tambahkan fail xml secara dinamik! Mula-mula tulis fail susun atur utama dan fail susun atur yang dimuatkan secara dinamik:

activity_main.xml:

public class MainActivity extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        Button btnOne = new Button(this);  
        btnOne.setText("我是动态添加的按钮");  
        RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(    
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);    
        lp2.addRule(RelativeLayout.CENTER_IN_PARENT);    
        RelativeLayout rly = (RelativeLayout) findViewById(R.id.RelativeLayout1);  
        rly.addView(btnOne,lp2);  
    }  
}

inflate.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <Button
        android:id="@+id/btnLoad"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="动态加载布局"/></RelativeLayout>

Kemudian pergi ke MainActivity.java kami dan muatkan susun atur xml secara dinamik di sini:

<?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="match_parent"  
    android:gravity="center"  
    android:orientation="vertical"  
    android:id="@+id/ly_inflate" >  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="我是Java代码加载的布局" />  
  
    <Button  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="我是布局里的一个小按钮" />  
  </LinearLayout>

Jalankan tangkapan skrin :

2.gif

Analisis kod:

①Dapatkan objek bekas:

public class MainActivity extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        //获得LayoutInflater对象;  
        final LayoutInflater inflater = LayoutInflater.from(this);    
        //获得外部容器对象  
        final RelativeLayout rly = (RelativeLayout) findViewById(R.id.RelativeLayout1);  
        Button btnLoad = (Button) findViewById(R.id.btnLoad);  
        btnLoad.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                //加载要添加的布局对象  
                LinearLayout ly = (LinearLayout) inflater.inflate(  
                        R.layout.inflate, null, false).findViewById(  
                        R.id.ly_inflate);  
                //设置加载布局的大小与位置  
                RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(    
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);    
                lp.addRule(RelativeLayout.CENTER_IN_PARENT);    
                rly.addView(ly,lp);  
            }  
        });  
    }  
}

②Dapatkan objek Inflater dan muatkannya pada masa yang sama Dalam xml susun atur yang ditambah, cari nod akar paling luar melalui findViewById

final RelativeLayout rly = (RelativeLayout) findViewById(R.id.RelativeLayout1);

③ Tetapkan maklumat saiz dan kedudukan untuk bekas ini:

final LayoutInflater inflater = LayoutInflater.from(this);
LinearLayout ly = (LinearLayout) inflater.inflate(R.layout.inflate, null, false)
   .findViewById(R.id.ly_inflate);

④Tambah pada bekas luar:

RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(  
               LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
       lp.addRule(RelativeLayout.CENTER_IN_PARENT);

4.Kod sumber kaedah LayoutInflater()

Finally , inflate LayoutInflater disediakan Kod sumber kaedah (), jika anda berminat, anda boleh lihat~, ia sebenarnya hanya analisis Tarik~

rly.addView(ly,lp);

Ringkasan bahagian ini:

Bahagian ini memberi penjelasan kepada Semua Orang LayoutInflater (perkhidmatan reka letak) dalam Android, serta pemuatan dinamik Paparan dan kawalan. Perkara yang berkaitan, saya percaya ia akan membantu rakan-rakan yang baru mengawal~Baiklah, itu sahaja, terima kasih~3.gif