Saya telah menyelidiki masalah ini, merujuk pada dokumen LayoutInflater dan membuat proyek percontohan sampel kecil. Tutorial berikut menunjukkan cara mengisi tata letak secara dinamis menggunakan LayoutInflater.
Sebelum kita mulai, lihat seperti apa LayoutInflater.inflate()parameternya:
- sumber daya : ID untuk sumber daya tata letak XML untuk memuat (misalnya,
R.layout.main_page)
- root : Tampilan opsional untuk menjadi induk dari hierarki yang dihasilkan (jika
attachToRootada true), atau hanya objek yang menyediakan seperangkat LayoutParamsnilai untuk root dari hierarki yang dikembalikan (jika attachToRootada false.)
attachToRoot : Apakah hirarki yang meningkat harus dilampirkan ke parameter root? Jika false, root hanya digunakan untuk membuat subclass yang benar LayoutParamsuntuk tampilan root dalam XML.
Pengembalian : Tampilan root dari hierarki yang meningkat. Jika akar disediakan dan attachToRootadalah true, ini adalah akar; jika tidak, ini adalah akar dari file XML yang dipompa.
Sekarang untuk tata letak sampel dan kode.
Tata letak utama ( main.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
Ditambahkan ke wadah ini adalah TextView terpisah, terlihat sebagai kotak merah kecil jika parameter tata letak berhasil diterapkan dari XML ( red.xml):
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="#ff0000"
android:text="red" />
Sekarang LayoutInflaterdigunakan dengan beberapa variasi parameter panggilan
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view, 100, 100);
// result: layout_height=25dp layout_width=25dp
// view=textView due to attachRoot=false
view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
Hasil aktual dari variasi parameter didokumentasikan dalam kode.
SYNOPSIS: Memanggil LayoutInflatertanpa menentukan lead root untuk mengembang panggilan mengabaikan parameter tata letak dari XML. Memanggil mengembang dengan root tidak sama nulldan attachRoot=truememuat parameter tata letak, tetapi mengembalikan objek root lagi, yang mencegah perubahan tata letak lebih lanjut ke objek yang dimuat (kecuali Anda dapat menemukannya menggunakan findViewById()). Karenanya, konvensi panggilan yang kemungkinan besar ingin Anda gunakan adalah yang ini:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
Untuk membantu dengan masalah tata letak, Inspektur Tata Letak sangat dianjurkan.