Cara Menambahkan Tampilan ke Tampilan secara Pemrograman
179
Katakanlah saya punya LinearLayout, dan saya ingin menambahkan tampilan, dalam program saya dari kode Java. Metode apa yang digunakan untuk ini? Saya tidak bertanya bagaimana itu dilakukan dalam XML, yang saya tahu, tetapi, bagaimana saya bisa melakukan sesuatu di sepanjang baris kode sampel ini?
Memanggil addViewadalah jawaban yang benar, tetapi Anda perlu melakukan sedikit lebih banyak dari itu untuk membuatnya bekerja.
Jika Anda membuat Tampilan melalui konstruktor (mis., Button myButton = new Button();), Anda harus memanggil setLayoutParamstampilan yang baru dibangun, dengan meneruskan kelas kelas LayoutParams tampilan induk, sebelum Anda menambahkan anak Anda yang baru dibangun ke tampilan induk.
Misalnya, Anda mungkin memiliki kode berikut dalam onCreate()fungsi Anda dengan asumsi LinearLayout Anda memiliki id R.id.main:
Pastikan untuk mengatur LayoutParams adalah penting. Setiap tampilan membutuhkan setidaknya parameter layout_width dan layout_height. Juga mendapatkan kelas batin yang tepat adalah penting. Saya kesulitan mendapatkan Tampilan ditambahkan ke TableRow untuk ditampilkan dengan benar sampai saya tahu bahwa saya tidak melewatkan instance dari TableRow.LayoutParams ke setLayoutParams tampilan anak.
Bagaimana Anda membuat tampilan secara terprogram tetapi dengan menggunakan file tata letak XML yang Anda buat khusus untuk tampilan baru ini?
SK9
9
@ SK9 Anda akan menggunakan LayoutInflater, yang bisa Anda dapatkan dari suatu Konteks, biasanya Aktivitas saat ini. Sesuatu seperti: LayoutInflater myInflater = getLayoutInflater; Lihat myView = myInflater.inflate (R.layout.myLayout, parent, false);
Brian Cooley
1
Sebenarnya getLayoutInflater () berasal dari kelas Window (bukan Konteks), dan ini adalah metode yang mudah digunakan di Activity.
Brian Cooley
2
Sebagai praktik pengkodean, di findViewById, dilemparkan ke ViewGroup atau selalu bentuk paling umum dari suatu objek sehingga jika itu berubah dari LinearLayout ke RelativeLayout, Anda tidak memiliki refactoring.
Joel Teply
1
Ini adalah beberapa detail: D
Vivek Solanki
51
untuk siapa pun yang belum tertarik:
cara terbaik yang saya temukan adalah menggunakan metode statis mengembang View.
harap perhatikan bahwa Anda memerlukan ViewGroup untuk menambahkan tampilan (yang merupakan tata letak apa pun yang dapat Anda pikirkan)
jadi sebagai contoh katakanlah Anda memiliki sebuah fragmen yang tampilan sudah meningkat dan Anda tahu bahwa tampilan root adalah tata letak, dan Anda ingin menambahkan tampilan ke dalamnya:
View view = getView();// returns base view of the fragmentif(view ==null)return;if(!(view instanceofViewGroup))return;ViewGroup viewGroup =(ViewGroup) view;View popup =View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);
Anda juga dapat menulis metode statis, sesuatu seperti addView(View v){ // your code after get view }itu akan mengambil pandangan yang ditemukan menggunakan findViewById(int resourceID)atau meningkat seperti inflatedView... Anda hanya untuk memperluas contoh fragmen Anda.
zgc7009
22
Ini sudah terlambat tetapi ini dapat membantu seseorang :) :) Untuk menambahkan tampilan, cobalah secara programatik
Gagasan untuk menetapkan batasan pemrograman bisa melelahkan. Solusi di bawah ini akan berfungsi untuk tata letak apa pun, apakah kendala, linier, dll. Cara terbaik adalah dengan menetapkan placeholder yaitu FrameLayout dengan batasan yang tepat (atau penempatan yang tepat di tata letak lain seperti linier) pada posisi di mana Anda akan mengharapkan tampilan yang dibuat secara program. memiliki.
Yang perlu Anda lakukan adalah mengembang tampilan secara pemrograman dan itu sebagai anak ke FrameLayout dengan menggunakan addChild()metode. Kemudian selama runtime tampilan Anda akan meningkat dan ditempatkan di posisi yang tepat. Sesuai rekomendasi Android, Anda hanya perlu menambahkan satu childView ke FrameLayout [tautan] .
Di sini akan terlihat seperti apa kode Anda, seandainya Anda ingin membuat TextView secara terprogram pada posisi tertentu:
Langkah 1:
Di tata letak Anda yang akan berisi tampilan yang akan meningkat, tempatkan FrameLayout di posisi yang benar dan beri id, katakanlah, "wadah".
Langkah 2
Buat tata letak dengan elemen root sebagai tampilan yang ingin Anda kembang saat runtime, panggil file tata letak sebagai "textview.xml":
BTW, atur tata letak-params dari frameLayout Anda untuk wrap_content selalu lain tata letak frame akan menjadi sebesar induknya yaitu aktivitas yaitu layar ponsel.
Jika tidak disetel, karena tampilan anak dari bingkai, secara default, pergi ke kiri atas tata letak bingkai, maka pandangan Anda hanya akan terbang ke kiri atas layar.
(Perhatikan bahwa pengaturan parameter terakhir findViewByIdke nulldan menambahkan tampilan dengan memanggil addView()tampilan wadah (frameLayout) sama dengan hanya melampirkan tampilan meningkat dengan mengirimkan trueparameter ke-3 findViewById(). Untuk lebih lanjut, lihat ini .)
Kalian juga harus memastikan bahwa ketika Anda menimpa onLayoutAnda HARUS menelepon super.onLayoutdengan semua properti, atau tampilan tidak akan meningkat!
untuk siapa pun yang belum tertarik:
cara terbaik yang saya temukan adalah menggunakan metode statis mengembang View.
di mana yourViewXML Anda seperti R.layout.myView
harap perhatikan bahwa Anda memerlukan ViewGroup untuk menambahkan tampilan (yang merupakan tata letak apa pun yang dapat Anda pikirkan)
jadi sebagai contoh katakanlah Anda memiliki sebuah fragmen yang tampilan sudah meningkat dan Anda tahu bahwa tampilan root adalah tata letak, dan Anda ingin menambahkan tampilan ke dalamnya:
sumber
addView(View v){ // your code after get view }
itu akan mengambil pandangan yang ditemukan menggunakanfindViewById(int resourceID)
atau meningkat sepertiinflatedView
... Anda hanya untuk memperluas contoh fragmen Anda.Ini sudah terlambat tetapi ini dapat membantu seseorang :) :) Untuk menambahkan tampilan, cobalah secara programatik
Ini akan membuat seluruh tampilan Anda terprogram. Anda dapat menambahkan jumlah tampilan yang sama. Semoga ini bisa membantu. :)
sumber
LinearLayout adalah subkelas dari ViewGroup , yang memiliki metode yang disebut addView . The addView metode harus apa yang Anda setelah.
sumber
Satu lagi cara untuk menambahkan tampilan dari Activity
sumber
Gagasan untuk menetapkan batasan pemrograman bisa melelahkan. Solusi di bawah ini akan berfungsi untuk tata letak apa pun, apakah kendala, linier, dll. Cara terbaik adalah dengan menetapkan placeholder yaitu FrameLayout dengan batasan yang tepat (atau penempatan yang tepat di tata letak lain seperti linier) pada posisi di mana Anda akan mengharapkan tampilan yang dibuat secara program. memiliki.
Yang perlu Anda lakukan adalah mengembang tampilan secara pemrograman dan itu sebagai anak ke FrameLayout dengan menggunakan
addChild()
metode. Kemudian selama runtime tampilan Anda akan meningkat dan ditempatkan di posisi yang tepat. Sesuai rekomendasi Android, Anda hanya perlu menambahkan satu childView ke FrameLayout [tautan] .Di sini akan terlihat seperti apa kode Anda, seandainya Anda ingin membuat TextView secara terprogram pada posisi tertentu:
Langkah 1:
Di tata letak Anda yang akan berisi tampilan yang akan meningkat, tempatkan FrameLayout di posisi yang benar dan beri id, katakanlah, "wadah".
Langkah 2 Buat tata letak dengan elemen root sebagai tampilan yang ingin Anda kembang saat runtime, panggil file tata letak sebagai "textview.xml":
BTW, atur tata letak-params dari frameLayout Anda untuk wrap_content selalu lain tata letak frame akan menjadi sebesar induknya yaitu aktivitas yaitu layar ponsel.
Jika tidak disetel, karena tampilan anak dari bingkai, secara default, pergi ke kiri atas tata letak bingkai, maka pandangan Anda hanya akan terbang ke kiri atas layar.
Langkah 3
Dalam metode oncreate Anda, lakukan ini:
(Perhatikan bahwa pengaturan parameter terakhir
findViewById
kenull
dan menambahkan tampilan dengan memanggiladdView()
tampilan wadah (frameLayout) sama dengan hanya melampirkan tampilan meningkat dengan mengirimkantrue
parameter ke-3findViewById()
. Untuk lebih lanjut, lihat ini .)sumber
Kalian juga harus memastikan bahwa ketika Anda menimpa
onLayout
Anda HARUS meneleponsuper.onLayout
dengan semua properti, atau tampilan tidak akan meningkat!sumber