Apa arti dari parameter LayoutInflater attachToRoot?

201

The LayoutInflater.inflatedokumentasi tidak persis jelas kepada saya tentang tujuan dari attachToRootparameter.

attachToRoot : apakah hirarki yang meningkat harus dilampirkan ke parameter root? Jika false, root hanya digunakan untuk membuat subclass LayoutParams yang benar untuk tampilan root dalam XML.

Bisakah seseorang tolong jelaskan secara lebih rinci, khususnya apa tampilan root, dan mungkin menunjukkan contoh perubahan perilaku antara truedan falsenilai - nilai?

Jeff Axelrod
sumber
1
Terkait: Masuk akal LayoutInflater
blahdiblah

Jawaban:

157

SEKARANG ATAU TIDAK SEKARANG

Perbedaan utama antara parameter "ketiga" attachToRoot menjadi benar atau salah adalah ini.

Saat Anda meletakkan attachToRoot

true: tambahkan tampilan anak ke orangtua KANAN SEKARANG
palsu: tambahkan tampilan anak ke orangtua TIDAK SEKARANG .
Tambahkan nanti. `

Kapan itu nanti ?

Itu nanti ketika Anda menggunakan misalnya parent.addView(childView)

Kesalahpahaman yang umum adalah, jika parameter attachToRoot salah maka tampilan anak tidak akan ditambahkan ke induk. SALAH
Dalam kedua kasus, tampilan anak akan ditambahkan ke parentView. Hanya masalah waktu .

inflater.inflate(child,parent,false);
parent.addView(child);   

setara dengan

inflater.inflate(child,parent,true);

A NO-NO BESAR
Anda seharusnya tidak pernah meneruskan attachToRoot sebagai true ketika Anda tidak bertanggung jawab untuk menambahkan tampilan anak ke orang tua.
Misalnya Saat menambahkan Fragmen

public View onCreateView(LayoutInflater inflater,ViewGroup parent,Bundle bundle)
  {
        super.onCreateView(inflater,parent,bundle);
        View view = inflater.inflate(R.layout.image_fragment,parent,false);
        .....
        return view;
  }

jika Anda melewatkan parameter ketiga sebagai true, Anda akan mendapatkan IllegalStateException karena orang ini.

getSupportFragmentManager()
      .beginTransaction()
      .add(parent, childFragment)
      .commit();

Karena Anda telah menambahkan fragmen anak di onCreateView () karena kesalahan. Memanggil tambah akan memberi tahu Anda bahwa tampilan anak sudah ditambahkan ke induk karenanya IllegalStateException .
Di sini Anda tidak bertanggung jawab untuk menambahkan childView, FragmentManager bertanggung jawab. Jadi selalu salah dalam kasus ini.

CATATAN: Saya juga membaca bahwa parentView tidak akan mendapatkan childView touchEvents jika attachToRoot salah. Tapi saya belum mengujinya.

Rohit Singh
sumber
6
Sangat membantu, terutama bagian mengenai FragmentManager, terima kasih!
CybeX
94

Jika disetel ke true maka ketika tata letak Anda meningkat itu akan secara otomatis ditambahkan ke hierarki tampilan dari ViewGroup yang ditentukan dalam parameter ke-2 sebagai anak. Misalnya jika parameter root adalah a LinearLayoutmaka tampilan Anda yang meningkat akan secara otomatis ditambahkan sebagai anak dari tampilan itu.

Jika disetel ke false maka tata letak Anda akan meningkat tetapi tidak akan dilampirkan ke tata letak lainnya (sehingga tidak akan ditarik, menerima acara sentuh dll).

Joseph Earl
sumber
17
Saya bingung. Saya mendapatkan "anak Ditentukan sudah memiliki kesalahan orangtua” sampai saya membaca jawaban ini , yang diarahkan saya untuk menggunakan falseuntuk attachToRootselama saya Fragmen ini onCreateView. Ini memecahkan masalah dan belum tata letak fragmen ini terlihat dan aktif, meskipun jawaban Anda. Apa yang terjadi di sini?
Jeff Axelrod
67
Karena Fragmen secara otomatis melampirkan tata letak yang dikembalikan dari onCreateView. Jadi jika Anda melampirkannya secara manual di onCreateView maka tampilan Anda akan dilampirkan ke 2 orang tua (yang menghasilkan kesalahan yang Anda sebutkan).
Joseph Earl
11
Saya agak bingung di sini, @JosephEarl Anda mengatakan jika diatur ke true, tampilan dilampirkan ke parameter 2 yang merupakan container, tetapi kemudian Anda mengatakan fragmen secara otomatis dilampirkan onCreateView(), jadi menurut pemahaman saya, parameter ketiga tidak berguna dan harus diatur falseselalu?
unmultimedio
5
Anda mengembalikan tampilan dalam oncreateview, ini kemudian secara otomatis dilampirkan. Jika Anda mengatur melampirkan ke true, kesalahan dilemparkan. Namun, ketika Anda mengembang tampilan dalam situasi mandiri, Anda dapat memilih untuk melampirkan tampilan ke wadahnya secara otomatis dengan mengatur true. Saya hampir tidak pernah menetapkan kenyataan karena saya selalu menambahkan tampilan sendiri.
dingin
7
@unmultimedio tidak berguna untuk tampilan root yang dikembalikan oleh onCreateView. Jika Anda mengembang tata letak lebih lanjut ke tampilan root itu, atau Anda menggembungkan dalam konteks yang berbeda (misalnya dalam suatu Kegiatan) maka itu berguna.
Joseph Earl
36

Sepertinya banyak teks dalam tanggapan tetapi tidak ada kode, itu sebabnya saya memutuskan untuk menghidupkan kembali pertanyaan lama ini dengan contoh kode, dalam beberapa tanggapan yang disebutkan orang:

Jika disetel ke true maka ketika tata letak Anda meningkat itu akan secara otomatis ditambahkan ke hierarki tampilan dari ViewGroup yang ditentukan dalam parameter ke-2 sebagai anak.

Apa yang sebenarnya berarti dalam kode (apa yang dipahami sebagian besar programmer) adalah:

public class MyCustomLayout extends LinearLayout {
    public MyCustomLayout(Context context) {
        super(context);
        // Inflate the view from the layout resource and pass it as child of mine (Notice I'm a LinearLayout class).

        LayoutInflater.from(context).inflate(R.layout.child_view, this, true);
    }
}

Perhatikan bahwa kode sebelumnya adalah menambahkan tata letak R.layout.child_viewsebagai anak MyCustomLayoutkarena attachToRootparam adalah truedan penerima params tata letak induk persis dengan cara yang sama seperti jika saya akan menggunakan addViewpemrograman, atau seolah-olah saya melakukan ini di xml:

<LinearLayout>
   <View.../>
   ...
</LinearLayout>

Kode berikut menjelaskan skenario ketika dilewatkan attachRootsebagai false:

LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setLayoutParams(new LayoutParams(
    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
linearLayout.setOrientation(LinearLayout.VERTICAL);
    // Create a stand-alone view
View myView = LayoutInflater.from(context)
    .inflate(R.layout.ownRootView, null, false);
linearLayout.addView(myView);

Dalam kode sebelumnya Anda tentukan yang Anda inginkan myView menjadi objek root sendiri dan tidak melampirkannya ke orangtua mana pun, kemudian kami menambahkannya sebagai bagian dari LinearLayouttetapi untuk sesaat itu adalah tampilan yang berdiri sendiri (tanpa orangtua).

Hal yang sama terjadi dengan Fragmen, Anda dapat menambahkannya ke grup yang sudah ada dan menjadi bagian darinya, atau hanya meneruskan parameter:

inflater.inflate (R.layout.fragment, null, false);

Untuk menentukan bahwa itu akan menjadi root sendiri.

Martin Cazares
sumber
1
Dari semua, ini adalah yang paling bermanfaat.
Wahib Ul Haq
26

Dokumentasi dan dua jawaban sebelumnya seharusnya cukup, hanya beberapa pemikiran dari saya.

The inflatemetode yang digunakan untuk mengembang file layout. Dengan tata letak yang meningkat itu Anda harus kemungkinan untuk melampirkannya langsung ke induk ViewGroupatau hanya mengembang hierarki tampilan dari file tata letak itu dan bekerja dengannya di luar hierarki tampilan normal.

Dalam kasus pertama attachToRootparameter harus disetel ke true(atau lebih sederhana menggunakan inflatemetode yang mengambil file tata letak dan root induk ViewGroup(bukan null)). Dalam hal ini yang Viewdikembalikan hanyalah ViewGroupyang dilewatkan dalam metode, ViewGroupyang akan ditambahkan hierarki tampilan.

Untuk opsi kedua yang dikembalikan Viewadalah root ViewGroupdari file layout. Jika Anda ingat diskusi terakhir kami dari include-mergepertanyaan pasangan, ini adalah salah satu alasan untuk mergepembatasan (ketika file tata letak dengan mergesebagai root meningkat, Anda harus menyediakan orangtua dan attachedToRootharus diatur ke true). Jika Anda memiliki file tata letak dengan mergetag root dan attachedToRootdiatur ke falsemaka inflatemetode tidak akan kembali karena mergetidak memiliki yang setara. Juga, seperti kata dokumentasi, inflateversi dengan attachToRootset ke falsepenting karena Anda dapat membuat tampilan hierarki dengan benarLayoutParamsdari orang tua. Ini penting dalam beberapa kasus, yang paling terkenal pada anak-anak dari AdapterView, subkelas dari ViewGroup, yangaddView()metode yang ditetapkan tidak didukung. Saya yakin Anda ingat menggunakan baris ini dalam getView()metode:

convertView = inflater.inflate(R.layout.row_layout, parent, false);

Baris ini memastikan bahwa R.layout.row_layoutfile yang digelembungkan memiliki yang benar LayoutParamsdari AdapterViewsubkelas yang ditetapkan pada akarnya ViewGroup. Jika Anda tidak akan melakukan ini, Anda dapat memiliki beberapa masalah dengan file tata letak jika root adalah a RelativeLayout. The TableLayout/TableRowjuga memiliki beberapa khusus dan penting LayoutParamsdan Anda harus memastikan pandangan di dalamnya memiliki yang benar LayoutParams.

Luksprog
sumber
18

Saya sendiri juga bingung tentang apa tujuan sebenarnya dari attachToRootdalam inflatemetode. Setelah sedikit belajar UI, saya akhirnya mendapatkan jawabannya:

induk:

dalam hal ini adalah widget / tata letak yang mengelilingi objek tampilan yang ingin Anda kembangkan menggunakan findViewById ().

attachToRoot:

melampirkan pandangan ke orang tua mereka (termasuk mereka dalam hierarki induk), sehingga setiap acara sentuh yang menerima pandangan juga akan ditransfer ke tampilan orang tua. Sekarang terserah orang tua apakah ingin menghibur acara-acara itu atau mengabaikannya. jika disetel ke false, mereka tidak ditambahkan sebagai anak-anak langsung dari orang tua dan orang tua tidak menerima acara sentuhan apa pun dari tampilan.

Semoga ini bisa menghilangkan kebingungan

Umer Farooq
sumber
Jawaban Anda sudah disediakan di sini: stackoverflow.com/questions/22326314/...
Neon Warge
11

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)
capt.swag
sumber
Penjelasan yang sederhana dan jelas, hanya apa yang saya cari!
flyingAssistant
10

Ada banyak kebingungan tentang topik ini karena dokumentasi untuk metode inflate ().

Secara umum, jika attachToRoot disetel ke true, maka file tata letak yang ditentukan dalam parameter pertama meningkat dan dilampirkan ke ViewGroup yang ditentukan dalam parameter kedua pada saat itu. Ketika attachToRoot salah, file tata letak dari parameter pertama meningkat dan dikembalikan sebagai tampilan dan lampiran tampilan apa pun terjadi di lain waktu.

Ini mungkin tidak banyak berarti kecuali Anda melihat banyak contoh. Saat memanggil LayoutInflater.inflate () di dalam metode onCreateView dari sebuah Fragmen, Anda ingin memberikan false untuk attachToRoot karena Aktivitas yang terkait dengan Fragment tersebut sebenarnya bertanggung jawab untuk menambahkan tampilan Fragment tersebut. Jika Anda menggembungkan secara manual dan menambahkan tampilan ke tampilan lain di beberapa titik waktu kemudian, seperti dengan metode addView (), Anda akan ingin memberikan false untuk attachToRoot karena lampiran datang pada titik waktu berikutnya.

Anda dapat membaca tentang beberapa contoh unik lainnya tentang Dialog dan Tampilan kustom pada posting blog yang saya tulis tentang topik ini.

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

seanjfarrell
sumber
4

attachToRootdisetel ke true berarti inflatedViewakan ditambahkan ke hierarki tampilan induk. Dengan demikian mungkin dapat "dilihat" dan merasakan peristiwa sentuhan (atau operasi UI lainnya) oleh pengguna. Jika tidak, itu baru saja dibuat, tidak ditambahkan ke hierarki tampilan apa pun dan dengan demikian tidak dapat dilihat atau menangani acara sentuh.

Untuk pengembang iOS yang baru mengenal Android, attachToRootsetel ke true berarti Anda memanggil metode ini:

[parent addSubview:inflatedView];

Jika melangkah lebih jauh Anda mungkin bertanya: Mengapa saya harus melewati tampilan orang tua jika saya set attachToRootke false? Itu karena elemen root di pohon XML Anda memerlukan tampilan induk untuk menghitung beberapa LayoutParams (seperti induk pertandingan).

Alston
sumber
0

Saat Anda menentukan induknya, attachToRoot menentukan apakah Anda ingin inflater melampirkannya pada induknya atau tidak. Dalam beberapa kasus ini menyebabkan masalah, seperti dalam ListAdapter itu akan menyebabkan pengecualian karena daftar mencoba untuk menambahkan tampilan ke daftar tetapi dikatakan sudah terlampir. Di tempat lain di mana Anda hanya menggembungkan tampilan sendiri untuk ditambahkan ke suatu Kegiatan, itu bisa berguna dan menghemat satu baris kode.

CaseyB
sumber
1
tidak memberikan gambaran yang jelas yang harus diberikan jawaban yang baik.
Prakhar1001
0

Misalnya kita memiliki ImageView, a, LinearLayoutdan a RelativeLayout. LinearLayout adalah anak dari RelativeLayout. Hirarki Lihat akan.

RelativeLayout
           ------->LinearLayout

dan kami memiliki file tata letak terpisah untuk ImageView

image_view_layout.xml

Lampirkan ke root:

//here container is the LinearLayout

    View v = Inflater.Inflate(R.layout.image_view_layout,container,true);
  1. Di sini v berisi referensi tata letak wadah yaitu LinearLayout.and jika Anda ingin mengatur parameter seperti setImageResource(R.drawable.np);dari ImageView Anda harus menemukannya dengan referensi dari induk yaituview.findById()
  2. Induk v akan menjadi FrameLayout.
  3. LayoutParams akan dari FrameLayout.

Tidak dilampirkan ke root:

//here container is the LinearLayout
    View v = Inflater.Inflate(R.layout.image_view_layout,container,false);
  1. Di sini v tidak berisi tata letak wadah referensi tetapi referensi langsung ke ImageView yang digelembungkan sehingga Anda dapat mengatur parameter seperti view.setImageResource(R.drawable.np);tanpa referensi wasit findViewById. Tapi container ditentukan sehingga ImageView mendapatkan LayoutParams dari container sehingga Anda bisa mengatakan bahwa referensi container hanya untuk LayoutParams.
  2. jadi dalam kasus tertentu Induk akan menjadi nol.
  3. LayoutParams adalah dari LinearLayout.
Faisal Naseer
sumber
0

aturToRoot Setel ke true:

Jika attachToRoot disetel ke true, maka file tata letak yang ditentukan dalam parameter pertama meningkat dan dilampirkan ke ViewGroup yang ditentukan dalam parameter kedua.

Bayangkan kita menentukan tombol dalam file tata letak XML dengan lebar tata letak dan tinggi tata letak diatur ke match_parent.

<Button xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/custom_button">
</Button>

Kami sekarang ingin secara terprogram menambahkan Tombol ini ke dalam LinearLayout di dalam Fragmen atau Aktivitas. Jika LinearLayout kami sudah menjadi variabel anggota, mLinearLayout, kami cukup menambahkan tombol dengan yang berikut:

inflater.inflate(R.layout.custom_button, mLinearLayout, true);

Kami menetapkan bahwa kami ingin mengembang Tombol dari file sumber daya tata letaknya; kami kemudian memberi tahu LayoutInflater bahwa kami ingin melampirkannya ke mLinearLayout. Parameter tata letak kami merasa terhormat karena kami tahu Tombol akan ditambahkan ke LinearLayout. Jenis params tata letak Button harus LinearLayout.LayoutParams.

attachToRoot Set ke false (tidak diharuskan untuk menggunakan false)

Jika attachToRoot disetel ke false, maka file tata letak yang ditentukan dalam parameter pertama meningkat dan tidak dilampirkan ke ViewGroup yang ditentukan dalam parameter kedua tetapi tampilan yang meningkat itu mengakuisisi LayoutParams orangtua yang memungkinkan tampilan agar sesuai dengan benar di induk.


Mari kita lihat kapan Anda ingin mengatur attachToRoot menjadi false. Dalam skenario ini, Lihat ditentukan dalam parameter pertama mengembang () tidak terlampir ke ViewGroup di parameter kedua pada saat ini dalam waktu.

Ingat contoh Tombol kami dari sebelumnya, di mana kami ingin melampirkan Tombol khusus dari file tata letak ke mLinearLayout. Kami masih dapat melampirkan Tombol kami ke mLinearLayout dengan mengirimkan false untuk attachToRoot — kami baru saja menambahkannya sendiri secara manual sesudahnya.

Button button = (Button) inflater.inflate(R.layout.custom_button,    mLinearLayout, false);
mLinearLayout.addView(button);

Kedua baris kode ini setara dengan apa yang kami tulis sebelumnya dalam satu baris kode ketika kami memberikan true untuk attachToRoot. Dengan memberikan false, kami mengatakan bahwa kami tidak ingin melampirkan View kami ke root ViewGroup dulu. Kami mengatakan bahwa itu akan terjadi di beberapa titik waktu lain. Dalam contoh ini, titik waktu lainnya hanyalah metode addView () yang digunakan tepat di bawah inflasi.

Contoh attachToRoot palsu membutuhkan sedikit lebih banyak pekerjaan ketika kita secara manual menambahkan tampilan ke ViewGroup.

attachToRoot Setel ke false (false Wajib)

Saat menggembungkan dan mengembalikan Tampilan Fragmen di onCreateView (), pastikan Anda memberikan false untuk attachToRoot. Jika Anda meneruskan dengan benar, Anda akan mendapatkan IllegalStateException karena anak yang ditentukan sudah memiliki orangtua. Anda harus menentukan di mana tampilan Fragmen Anda akan ditempatkan kembali di Aktivitas Anda. Adalah tugas FragmentManager untuk menambah, menghapus, dan mengganti Fragmen.

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment =  fragmentManager.findFragmentById(R.id.root_viewGroup);

if (fragment == null) {
fragment = new MainFragment();
fragmentManager.beginTransaction()
    .add(R.id.root_viewGroup, fragment)
    .commit();
}

Wadah root_viewGroup yang akan menampung Fragmen Anda di Aktivitas Anda adalah parameter ViewGroup yang diberikan kepada Anda di onCreateView () di Fragment Anda. Ini juga merupakan ViewGroup yang Anda berikan ke LayoutInflater.inflate (). FragmentManager akan menangani melampirkan View Fragment Anda ke ViewGroup ini. Anda tidak ingin melampirkannya dua kali. Setel attachToRoot ke false.

public View onCreateView(LayoutInflater inflater, ViewGroup  parentViewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout,     parentViewGroup, false);

return view;
}

Mengapa kita diberi ViewGroup induk Fragment kami di tempat pertama jika kita tidak ingin melampirkannya di onCreateView ()? Mengapa metode mengembang () meminta ViewGroup root?

Ternyata bahkan ketika kita tidak segera menambahkan Tampilan kami yang baru meningkat ke ViewGroup induknya, kita masih harus menggunakan LayoutParams induk agar View baru untuk menentukan ukuran dan posisinya kapan pun akhirnya terpasang.

Tautan: https://youtu.be/1Y0LlmTCOkM?t=409

Bawahan
sumber
0

Hanya berbagi beberapa poin yang saya temui saat mengerjakan topik ini,

Selain jawaban yang diterima saya ingin beberapa poin yang dapat membantu.

Jadi, ketika saya menggunakan attachToRoot sebagai true, tampilan yang dikembalikan adalah tipe ViewGroup yaitu root ViewGroup induk yang dilewatkan sebagai parameter untuk metode mengembang (layoutResource, ViewGroup, attachToRoot) , bukan jenis tata letak yang dilewatkan tetapi pada attachToRoot sebagai false kita mendapatkan tipe fungsi pengembalian ViewGroup root layoutResource itu .

Izinkan saya menjelaskan dengan sebuah contoh:

Jika kita memiliki LinearLayout sebagai tata letak root dan kemudian kita ingin menambahkan TextView di dalamnya melalui fungsi mengembang .

kemudian menggunakan attachToRoot sebagai benar fungsi mengembang mengembalikan View jenis LinearLayout

saat menggunakan attachToRoot sebagai fungsi semburan palsu mengembalikan Tampilan tipe TextView

Semoga temuan ini dapat membantu ...

HARIS UMAID
sumber