LayoutInflater belgelerine atıfta bulunarak ve küçük bir örnek tanıtım projesi ayarlayarak bu sorunu araştırdım . Aşağıdaki öğreticiler kullanarak bir mizanpajın dinamik olarak nasıl doldurulacağını gösterir LayoutInflater
.
Başlamadan önce hangi LayoutInflater.inflate()
parametrelerin nasıl göründüğüne bakın:
- resource : Yüklenecek bir XML mizanpaj kaynağının kimliği (ör.
R.layout.main_page
)
- root : Oluşturulan hiyerarşinin üst
attachToRoot
öğesi (isteğe bağlı) veya isteğe bağlı görünüm , döndürülen hiyerarşinin kökü (eğer ise ) için true
bir dizi LayoutParams
değer sağlayan bir nesne olabilir .attachToRoot
false
attachToRoot : Şişirilmiş hiyerarşinin root parametresine eklenip eklenmeyeceği ? False olursa, root yalnızca XML'deki LayoutParams
kök görünüm için doğru alt sınıfını oluşturmak için kullanılır .
Döndürür : Şişirilmiş hiyerarşinin kök görünümü. Kök sağlanmışsa ve attachToRoot
ise true
, bu köktür; aksi takdirde şişirilmiş XML dosyasının köküdür.
Şimdi örnek düzen ve kod için.
Ana düzen ( 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>
Bu kapsayıcıya, düzen parametreleri XML'den başarıyla uygulandığında küçük kırmızı kare olarak görünen ayrı bir TextView eklenir 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" />
Şimdi LayoutInflater
birkaç çağrı parametresi varyasyonu ile kullanılır
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);
}
}
Parametre varyasyonlarının gerçek sonuçları kodda belgelenmiştir.
ÖZET: çağrılması LayoutInflater
XML düzen parametreleri göz ardı şişirmek çağrısına kök yol belirtmeden. Kök ile şişirmek çağrıldığında eşit değildir null
ve attachRoot=true
düzen parametrelerini yükler, ancak kök nesneyi yeniden döndürerek yüklenen nesnede daha fazla düzen değişikliği yapılmasını önler (kullanarak bulamazsanız findViewById()
). Büyük olasılıkla kullanmak isteyeceğiniz çağrı kuralı şu şekildedir:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
Düzen sorunlarına yardımcı olması için Düzen Denetçisi önemle tavsiye edilir.