Saya menulis jawaban ini karena bahkan setelah melewati beberapa halaman StackOverflow saya tidak dapat memahami dengan jelas apa arti attachToRoot. Di bawah ini adalah metode mengembang () di kelas LayoutInflater.
View inflate (int resource, ViewGroup root, boolean attachToRoot)
Lihatlah file activity_main.xml , tata letak button.xml dan file MainActivity.java yang saya buat.
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
button.xml
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater inflater = getLayoutInflater();
LinearLayout root = (LinearLayout) findViewById(R.id.root);
View view = inflater.inflate(R.layout.button, root, false);
}
Saat kami menjalankan kode, kami tidak akan melihat tombol di tata letak. Ini karena tata letak tombol kami tidak ditambahkan ke tata letak aktivitas utama karena attachToRoot disetel ke false.
LinearLayout memiliki metode addView (View view) yang dapat digunakan untuk menambahkan Views ke LinearLayout. Ini akan menambahkan tata letak tombol ke tata letak aktivitas utama, dan membuat tombol terlihat ketika Anda menjalankan kode.
root.addView(view);
Mari kita hapus baris sebelumnya, dan lihat apa yang terjadi ketika kita menetapkan attachToRoot sebagai true.
View view = inflater.inflate(R.layout.button, root, true);
Sekali lagi kita melihat bahwa tata letak tombol terlihat. Ini karena attachToRoot secara langsung melampirkan tata letak yang meningkat ke induk yang ditentukan. Yang dalam hal ini adalah root LinearLayout. Di sini kita tidak perlu menambahkan view secara manual seperti yang kita lakukan pada kasus sebelumnya dengan metode addView (View view).
Mengapa orang mendapatkan IllegalStateException ketika mengatur attachToRoot sebagai true untuk sebuah Fragmen.
Ini karena untuk sebuah fragmen Anda telah menentukan di mana harus meletakkan tata letak fragmen Anda di file aktivitas Anda.
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.root, fragment)
.commit();
The add (int orangtua, Fragmen fragmen) menambahkan fragmen yang memiliki tata letak itu ke tata letak induk. Jika kami menetapkan attachToRoot sebagai true, Anda akan mendapatkan IllegalStateException: Anak yang ditentukan sudah memiliki orangtua. Karena tata letak fragmen sudah ditambahkan ke tata letak induk dalam metode add ().
Anda harus selalu memberikan false untuk attachToRoot ketika Anda menggembungkan Fragmen. Adalah tugas FragmentManager untuk menambah, menghapus, dan mengganti Fragmen.
Kembali ke contoh saya. Bagaimana jika kita melakukan keduanya.
View view = inflater.inflate(R.layout.button, root, true);
root.addView(view);
Di baris pertama, LayoutInflater melampirkan tata letak tombol ke tata letak akar dan mengembalikan objek tampilan yang memegang tata letak tombol yang sama. Di baris kedua, kita menambahkan objek View yang sama ke tata letak root induk. Ini menghasilkan IllegalStateException yang sama yang kami lihat dengan Fragmen (Anak yang ditentukan sudah memiliki orangtua).
Perlu diingat bahwa ada metode inflate () kelebihan beban lainnya, yang menetapkan attachToRoot sebagai true secara default.
View inflate (int resource, ViewGroup root)