Cara mengembang satu tampilan dengan tata letak


221

Saya memiliki tata letak yang didefinisikan dalam XML. Berisi juga:

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

Saya ingin mengembang RelativeView ini dengan file tata letak XML lainnya. Saya dapat menggunakan tata letak yang berbeda tergantung situasi. Bagaimana saya harus melakukannya? Saya mencoba berbagai variasi

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

Tapi tidak ada yang bekerja dengan baik.

Jawaban:


390

Saya tidak yakin saya telah mengikuti pertanyaan Anda - apakah Anda mencoba melampirkan pandangan anak ke RelativeLayout? Jika demikian, Anda ingin melakukan sesuatu seperti:

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

3
Saya mendapatkan kesalahan: 02-25 22: 21: 19.324: ERROR / AndroidRuntime (865): Disebabkan oleh: java.lang.IllegalStateException: Anak yang ditentukan sudah memiliki orangtua. Anda harus memanggil removeView () pada orang tua anak terlebih dahulu.
Michal Dymel

27
Baru saja mencoba ini sekarang, saya perlu: Lihat child = getLayoutInflater (). Mengembang (R.layout.child, null);
James

3
Masalahnya bukan kode. Cukup mudah untuk mengikuti kode. Di mana Anda membuat file xml. Apakah tipe sumber gaya tema? masalahnya saya pikir orang yang saya masukkan adalah di mana kita menempatkan file xml ini
Lpc_dark

15
Ini tidak sempurna. Versi 3-param dari inflater harus digunakan - inilah sebabnya: doubleencore.com/2013/05/layout-inflation-as-intended
Nick Cardoso

3
Jawabannya salah, bahkan jika itu berhasil. Silakan periksa pos ini possiblemobile.com/2013/05/layout-inflation-as-intended
ARK

107

Anda mengembang sumber XML. Lihat dokumen LayoutInflater .

Jika tata letak Anda di mylayout.xml , Anda akan melakukan sesuatu seperti:

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
Tampilan utama saya meningkat. Masalahnya adalah saya ingin mengembang sebagian dari file XML lainnya. Item ini RelativeLayout adalah bagian dari tata letak yang lebih besar dan saya ingin mengisinya dengan tata letak dari file XML lain.
Michal Dymel

hum saya minta maaf maka saya tidak tahu :(. Apakah Anda menggunakan sesuatu seperti <include> dalam tampilan utama Anda untuk memasukkan tata letak lainnya?
ccheneson

Tidak, ini tata letak sederhana. Saya pikir saya hanya akan menambahkan elemen saya secara pemrograman - tanpa XML. Terimakasih atas bantuannya!
Michal Dymel

27

Meskipun terlambat menjawab, tetapi ingin menambahkan satu cara untuk mendapatkan ini

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

di mana itemtata letak induk tempat Anda ingin menambahkan tata letak anak.


(bahkan lebih lambat lagi) Saya mengalami kesulitan menerapkan jawaban Anda. Saya mencoba kode yang Anda sebutkan di atas tetapi mengganti 'item' dengan: 'R.layout.activity_layout' Saya mendapatkan "Tidak ada metode yang berlaku untuk '(int, int)'" bisakah saya menyusahkan Anda karena pikiran Anda?
Kyle

1
@Kyle - bahkan lebih lambat lagi. Anda tidak dapat menggunakan Rsumber daya sebagai referensi ke objek, mereka hanya ints. Anda harus menggunakan findViewByIdmeneruskannya Rsumber daya, lalu ketik melemparkannya ke objek yang Anda inginkan. Kemudian Anda dapat menggunakannya dalam panggilan fungsi seperti inflate. (mis. ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... maka Anda dapat menggunakan itemseperti di atas.)
Pimp Trizkit

Saya kira saya harus menggunakan RelativeLayoutdaripada ViewGroupada dalam contoh saya di atas, karena Anda tidak dapat membuat instance kelas dasar ViewGroup. Aturan edit 5 menit membuat saya. lol
Pimp Trizkit

Apakah mungkin untuk menyembunyikan orang tua dan hanya menampilkan tampilan anak
NovusMobile

Terima kasih, metode ini membantu di mana saya tidak bisa menggunakan getContext () pada contoh sebelumnya karena saya menggunakan fragmen.
RightHandedMonkey

19

Sangat membantu untuk menambahkan ini, meskipun itu adalah posting lama, bahwa jika tampilan anak yang sedang digelembungkan dari xml akan ditambahkan ke tata letak viewgroup, Anda perlu memanggil mengembang dengan petunjuk tentang jenis viewgroup yang sedang berjalan untuk ditambahkan. Suka:

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

Metode mengembang cukup kelebihan beban dan menggambarkan bagian ini penggunaan dalam dokumen. Saya punya masalah di mana satu tampilan meningkat dari xml tidak menyelaraskan di induk dengan benar sampai saya membuat jenis perubahan ini.


Akhirnya, terima kasih :) Ini memungkinkan untuk menambahkan banyak tampilan ke satu orangtua, tetapi tanpa perlu khawatir tentang LayoutParams - yang dibaca dari XML. Kerja bagus!
Sabo

13

Cara yang lebih sederhana adalah menggunakan

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

Menggunakan View.inflate()adalah cara terbaik, tidak ada yang tidak perlu LayoutInflateratau getSystemService(Context.LAYOUT_INFLATER_SERVICE)atau semua gangguan itu! : D
varun

8

tata letak inflasi

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

6

Jika Anda tidak dalam suatu kegiatan, Anda dapat menggunakan from()metode statis dari LayoutInflaterkelas untuk mendapatkan LayoutInflater, atau meminta layanan dari metode konteks getSystemService()juga:

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

(Saya tahu ini hampir 4 tahun yang lalu tetapi masih layak disebut)


4

Jika Anda ingin menambahkan satu tampilan beberapa kali, maka Anda harus menggunakannya

   layoutInflaterForButton = getActivity().getLayoutInflater();

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

Jika Anda suka

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

dan

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

maka itu akan membuang pengecualian dari semua tampilan siap ditambahkan.


4

AttachToRoot Set ke True

Bayangkan saja kami 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>

Pada Tombol Ini Klik Acara Kita Dapat Mengatur Kode Berikut untuk Mengembang Layout pada Kegiatan Ini.

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

Semoga solusi ini bekerja untuk Anda.!


3

Coba kode ini:

  1. Jika Anda hanya ingin mengembang tata letak Anda:

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. Jika Anda ingin mengembang tata letak Anda dalam wadah (tata letak induk):

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

Saya mengalami kesulitan dengan kesalahan ini, karena keadaan unik saya, tetapi akhirnya menemukan solusi.

Situasi saya: Saya menggunakan tampilan terpisah (XML) yang berisi WebView, lalu terbuka di AlertDialogsaat saya mengklik tombol di tampilan aktivitas utama saya. Tapi entah bagaimana WebViewmilik dari tampilan aktivitas utama (mungkin karena saya menarik sumber daya dari sini), jadi tepat sebelum saya menugaskannya ke AlertDialog(sebagai tampilan), saya harus meminta orang tua saya WebView, memasukkannya ke ViewGroup, lalu hapus semua tampilan itu ViewGroup. Ini berhasil, dan kesalahan saya hilang.

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

.... nanti setelah saya memuat 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

Jika Anda mencoba melampirkan tampilan anak ke RelativeLayout? Anda bisa melakukannya dengan mengikuti

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

1

Dengan Kotlin, Anda dapat menggunakan:

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

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

-1

Saya telah menggunakan potongan kode di bawah ini untuk ini dan itu berhasil untuk saya.

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.