Bir görünümü mizanpajla şişirmek


221

XML'de tanımlanmış bir düzen var. Ayrıca şunları içerir:

<RelativeLayout
    android:id="@+id/item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

Bu RelativeView diğer XML düzen dosyası ile şişirmek istiyorum. Duruma bağlı olarak farklı düzenler kullanabilirim. Bunu nasıl yapmalıyım? Farklı varyasyonları deniyordum

RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)

Ama hiçbiri iyi çalışmadı.

Yanıtlar:


390

Sorunuzu takip ettiğimden emin değilim - RelativeLayout'a bir alt görünüm eklemeye mi çalışıyorsunuz? Eğer öyleyse, aşağıdaki satırlarda bir şeyler yapmak istersiniz:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);

3
Bir hata alıyorum: 02-25 22: 21: 19.324: ERROR / AndroidRuntime (865): Neden: java.lang.IllegalStateException: Belirtilen çocuğun zaten bir üst öğesi var. Önce çocuğun üst öğesinde removeView () öğesini çağırmalısınız.
Michal Dymel

27
Sadece şimdi denedim, gerekli: View child = getLayoutInflater (). İnflate (R.layout.child, null);
James

3
Sorun kod değil. Kodu takip etmek oldukça kolaydır. Xml dosyasını nerede yaparsınız. tema stili kaynağı nedir? insanlar dahil beni düşünüyorum sorun nereye biz bu xml dosyası yerleştiriyor
Lpc_dark

15
Bu mükemmel değil. Şişiricinin
Nick Cardoso

3
Cevap, çalışıyor olsa bile yanlıştır. Lütfen bu
ARK

107

Bir XML kaynağını şişiriyorsunuz. LayoutInflater belgesine bakın .

Düzeniniz bir mylayout.xml dosyasındaysa , aşağıdakine benzer bir şey yaparsınız:

View view; 
LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);

RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);

4
Ana görüşüm şişirilmiş. Sorun, bir kısmını diğer XML dosyasından şişirmek istiyorum. Bu öğe RelativeLayout daha büyük mizanpajın bir parçası ve bunu başka bir XML dosyasındaki mizanpajla doldurmak istiyorum.
Michal Dymel

Hum Üzgünüm o zaman hiçbir ipucu var :(. Ana görünümünde diğer düzeni dahil etmek için <include> gibi bir şey kullanıyor musunuz?
ccheneson

Hayır, basit bir düzen. Bence sadece XML olmadan öğelerimi programlı olarak ekleyeceğim. Yardım için teşekkürler!
Michal Dymel

27

Geç cevap rağmen, ama bunu elde etmek için bir yol eklemek istiyorum

LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.mylayout, item );

Nerede itemBir alt düzen eklemek istediğiniz üst düzenidir.


(hatta daha sonra bile) Cevabınızı uygulamakta zorlanıyorum. Yukarıda bahsettiğin kodu denedim ama 'item' ile değiştirdim: 'R.layout.activity_layout' '' (int, int) 'için geçerli bir yöntem yok' 'diye düşünürsün Düşüncelerin için sana sorun çıkarabilir miyim?
Kyle

1
@Kyle - daha sonra hala. RKaynakları bir nesneye referans olarak kullanamazsınız , bunlar sadece ints'dir. Kaynağı findViewByIdiletmek için kullanmanız ve Rardından istediğiniz nesneye cast yazmanız gerekir. Sonra gibi işlev çağrılarında kullanabilirsiniz inflate. (yani. ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... o zaman itemyukarıdaki gibi kullanabilirsiniz .)
Pimp Trizkit

Ben temel sınıf somutlaştırmak olamaz gibi yukarıdaki örnekte orada RelativeLayoutyerine bahsetmek sanırım . 5 dakikalık düzenleme kuralı beni aldı. lolViewGroupViewGroup
Pezevenk Trizkit

Ebeveyni gizlemek ve sadece çocuk görünümünü görüntülemek mümkün mü
NovusMobile

Teşekkürler, bu yöntem parçaları kullandığım için önceki örnekte getContext () kullanamadım yardımcı oldu.
RightHandedMonkey

19

Buna eski bir yazı olmasına rağmen, xml'den şişirilen çocuk görünümü bir görünüm grubu düzenine eklenecekse, şişirmek için ne tür bir görünüm grubu olduğuna dair bir ipucu ile çağırmanız gerekir. eklenecek. Sevmek:

View child = getLayoutInflater().inflate(R.layout.child, item, false);

Şişirme yöntemi oldukça fazladır ve dokümanlardaki kullanımın bu bölümünü açıklar. Bu tür bir değişiklik yapana kadar xml'den şişirilmiş tek bir görünümün ana öğede düzgün hizalanmamasıyla ilgili bir sorun yaşadım.


Son olarak, teşekkür ederim :) Bu, tek bir ebeveyne birden çok görünüm eklemenize izin verir, ancak XML'den okunan LayoutParams hakkında endişelenmenize gerek kalmaz. Aferin!
Sabo

13

Daha basit bir yol kullanmak

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item

Kullanmanın View.inflate()en iyi yolu, gereksiz LayoutInflaterya getSystemService(Context.LAYOUT_INFLATER_SERVICE)da ya da tüm bu rahatsızlık! : D
varun

8

düzen enflasyonu

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);

6

Bir aktivitede değilseniz from(), LayoutInflatersınıftan statik yöntemi kullanarak bir alabilir LayoutInflaterveya bağlam yönteminden getSystemService()de hizmet isteyebilirsiniz :

LayoutInflater i;
Context x;       //Assuming here that x is a valid context, not null

i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);

(Neredeyse 4 yıl önce olduğunu biliyorum ama yine de bahsetmeye değer)


4

Tek bir görünümü birden çok kez eklemek istiyorsanız,

   layoutInflaterForButton = getActivity().getLayoutInflater();

 for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
        FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
        btnContainer.addView(btnView);
    }

Beğendiysen

   layoutInflaterForButton = getActivity().getLayoutInflater();
    FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);

ve

for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
            btnContainer.addView(btnView);
        }

tüm eklenmiş görünümün istisnasını atar.


4

AttachToRoot True olarak ayarlandı

XML mizanpaj dosyasında mizanpaj genişliği ve mizanpaj yüksekliği match_parent olarak ayarlanmış bir düğme belirlediğimizi düşünün.

<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>

Bu Düğmelerde Bu Etkinlikteki Düzeni Şişirmek için Aşağıdaki Kodu Ayarlayabileceğimiz Olay'ı tıklatın.

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);

Umarım bu çözüm sizin için çalışır.!


3

Bu kodu deneyin:

  1. Düzeninizi şişirmek istiyorsanız:

View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);   

  1. Düzeninizi kapsayıcıya şişirmek istiyorsanız (üst düzen):

LinearLayout parent = findViewById(R.id.container);        //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false); 
RelativeLayout item = view.findViewById(R.id.item);       //initialize layout & By this you can also perform any event.
parent.addView(view);             //adding your inflated layout in parent layout.


2

Eşsiz durumlarım nedeniyle bu hatayla en zor zaman geçirdim, ancak sonunda bir çözüm buldum.

Benim durumum: Ana etkinlik görünümümde bir düğmeyi tıklattığımda bir WebView, daha sonra açılan ayrı bir görünüm (XML) kullanıyorum AlertDialog. Ama öyle ya da WebViewana faaliyet görünümünde (muhtemelen buradan kaynak çekmek için), çok doğru kız kardeşime karşı bunu atanan önce aitti AlertDialog(bir görünüm olarak), yaşıyorum benim üst öğesini almak zorunda kaldı WebView, bir koydu ViewGroup, ardından bu konudaki tüm görünümleri kaldırın ViewGroup. Bu işe yaradı ve benim hatam gitti.

// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);

// more code...

.... daha sonra yüklendikten sonra WebView....

// first, remove the parent of WebView from it's old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();

// put WebView in Dialog box
alert.setView(webView);
alert.show();

2

RelativeLayout'a bir alt görünüm eklemeye çalışıyorsanız? takip ederek yapabilirsin

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);

1

Kotlin ile şunları kullanabilirsiniz:

val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)

[your_main_layout].apply {
    //..
    addView(content)
}

-1

Bunun için kod snippet'ini kullanmıştım ve benim için çalıştı.

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.