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?

(One View).add(Another View)

Seperti yang bisa dilakukan di Swing.

Moki
sumber

Jawaban:

248

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:

LinearLayout myLayout = findViewById(R.id.main);

Button myButton = new Button(this);
myButton.setLayoutParams(new LinearLayout.LayoutParams(
                                     LinearLayout.LayoutParams.MATCH_PARENT,
                                     LinearLayout.LayoutParams.MATCH_PARENT));

myLayout.addView(myButton);

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.

Brian Cooley
sumber
5
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.

View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);

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:

    View view = getView(); // returns base view of the fragment
    if (view == null)
        return;
    if (!(view instanceof ViewGroup))
        return;

    ViewGroup viewGroup = (ViewGroup) view;
    View popup = View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);
ndori
sumber
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

LinearLayout rlmain = new LinearLayout(this);      
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);          
LinearLayout   ll1 = new LinearLayout (this);

ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.logo);              
LinearLayout .LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

iv.setLayoutParams(lp);
ll1.addView(iv);
rlmain.addView(ll1);              
setContentView(rlmain, llp);

Ini akan membuat seluruh tampilan Anda terprogram. Anda dapat menambahkan jumlah tampilan yang sama. Semoga ini bisa membantu. :)

AndroidOptimist
sumber
20

LinearLayout adalah subkelas dari ViewGroup , yang memiliki metode yang disebut addView . The addView metode harus apa yang Anda setelah.

Klarth
sumber
3

Satu lagi cara untuk menambahkan tampilan dari Activity

ViewGroup rootLayout = findViewById(android.R.id.content);
rootLayout.addView(view);
yoAlex5
sumber
0

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

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

</TextView>

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.

android:layout_width="wrap_content"
android:layout_height="wrap_content"

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:

FrameLayout frameLayout = findViewById(R.id.container);
                TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
                frameLayout.addView(textView);

(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 .)

Kush
sumber
0

Kalian juga harus memastikan bahwa ketika Anda menimpa onLayoutAnda HARUS menelepon super.onLayoutdengan semua properti, atau tampilan tidak akan meningkat!

Oz Shabat
sumber