Bu cevabı yazdım çünkü birkaç StackOverflow sayfasına geçtikten sonra bile attachToRoot'un ne anlama geldiğini net bir şekilde kavrayamadım. LayoutInflater sınıfındaki inflate () yöntemi aşağıdadır.
View inflate (int resource, ViewGroup root, boolean attachToRoot)
Activity_main.xml dosyasına, button.xml düzenine ve oluşturduğum MainActivity.java dosyasına bir göz atın .
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);
}
Kodu çalıştırdığımızda, düzende düğmeyi görmeyiz. Bu, attachToRoot öğesi false olarak ayarlandığından düğme düzenimizin ana etkinlik düzenine eklenmemesidir.
LinearLayout'ta bir Görünümleri LinearLayout'a eklemek için kullanılabilen addView (Görünüm görünümü) yöntemine sahiptir. Bu, düğme düzenini ana etkinlik düzenine ekler ve kodu çalıştırdığınızda düğmeyi görünür hale getirir.
root.addView(view);
Önceki satırı kaldıralım ve attachToRoot'u true olarak ayarladığımızda ne olacağını görelim.
View view = inflater.inflate(R.layout.button, root, true);
Yine düğme düzeninin görünür olduğunu görüyoruz. Bu, attachToRoot'un şişirilmiş düzeni doğrudan belirtilen üst öğeye iliştirmesidir. Bu durumda kök LinearLayout. Burada, addView (View view) yöntemiyle önceki durumda yaptığımız gibi görünümleri manuel olarak eklemek zorunda değiliz.
Kişiler, AttaToRoot'u bir Parça için true olarak ayarlarken neden IllegalStateException özel durumunu alıyorlar.
Bunun nedeni, bir fragman için, fragman düzeninizi etkinlik dosyanıza nereye yerleştireceğinizi belirtmiş olmanızdır.
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.root, fragment)
.commit();
Eklenti (int veli, Fragment fragmanı) ebeveyn düzeni 's düzene sahip parçasını ekler. AttachToRoot öğesini true olarak ayarlarsak, IllegalStateException özelliğini alırsınız: Belirtilen alt öğenin zaten bir üst öğesi var. Parça düzeni, add () yöntemindeki üst düzene zaten eklenmiş olduğundan.
Fragment'ları şişirirken attachToRoot için her zaman false iletmelisiniz. Parça eklemek, kaldırmak ve değiştirmek FragmentManager'ın görevidir.
Örneğime geri dön. Ya ikisini de yaparsak.
View view = inflater.inflate(R.layout.button, root, true);
root.addView(view);
İlk satırda, LayoutInflater düğme düzenini kök düzenine ekler ve aynı düğme düzenini tutan bir View nesnesi döndürür. İkinci satırda, aynı Görünüm nesnesini üst kök düzenine ekliyoruz. Bu, Parçalar ile gördüğümüz aynı IllegalStateException ile sonuçlanır (Belirtilen çocuğun zaten bir üst öğesi var).
AttachToRoot'u varsayılan olarak true olarak ayarlayan başka bir aşırı yüklenmiş inflate () yöntemi olduğunu unutmayın.
View inflate (int resource, ViewGroup root)