Android - Secara dinamis menambahkan tampilan ke tampilan

148

Saya memiliki tata letak untuk tampilan -

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="0px"
    android:orientation="vertical">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_header"
        style="@style/Home.ListHeader" />

    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_none"
        android:visibility="gone"
        style="@style/TextBlock"
        android:paddingLeft="6px" />

    <ListView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_list" />


</LinearLayout>

Yang ingin saya lakukan, adalah kegiatan utama saya dengan tata letak seperti ini

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="0px"
    android:id="@+id/item_wrapper">
</LinearLayout>

Saya ingin mengulang melalui model data saya dan menyuntikkan beberapa tampilan yang terdiri dari tata letak pertama ke tata letak utama. Saya tahu saya bisa melakukan ini dengan membangun kontrol sepenuhnya dalam kode, tetapi saya bertanya-tanya apakah ada cara untuk membangun pandangan secara dinamis sehingga saya dapat terus menggunakan tata letak alih-alih meletakkan segala sesuatu dalam kode.

Josh
sumber
Anda dapat memeriksa jawabannya untuk stackoverflow.com/questions/3995215/…
Tell Me How

Jawaban:

230

Gunakan LayoutInflateruntuk membuat tampilan berdasarkan templat layout Anda, dan kemudian menyuntikkannya ke tampilan di mana Anda membutuhkannya.

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.your_layout, null);

// fill in any details dynamically here
TextView textView = (TextView) v.findViewById(R.id.a_text_view);
textView.setText("your text");

// insert into main view
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

Anda mungkin harus menyesuaikan indeks tempat Anda ingin menyisipkan tampilan.

Selain itu, atur LayoutParams sesuai dengan keinginan Anda agar sesuai dengan tampilan induk. misalnya dengan FILL_PARENT, atau MATCH_PARENT, dll.

Mark Fisher
sumber
2
itu di mana pun Anda ingin meletakkan tata letak yang dihasilkan secara dinamis di tampilan utama Anda. itulah bagian yang harus Anda isi dari kode Anda sendiri.
Mark Fisher
Bagi mereka yang ingin mencoba ini sekarang - inflator tata letak yang diperoleh seperti yang ditunjukkan pada baris pertama masih teratasi tetapi tampaknya tidak berfungsi, alih-alih gunakangetLayoutInflater()
Brendan
2
Gunakan LayoutInflater vi = getLayoutInflater();dari suatu aktivitas untuk melestarikan tema aktivitas yang tidak Anda dapatkan sebaliknya.
akarthik10
1
@ MR Anda harus mengajukan pertanyaan terpisah pada SO. Pertanyaan ini adalah tentang cara membuat tampilan secara dinamis, bukan tentang fragmen.
Mark Fisher
2
@Arsh Jika Anda memiliki pertanyaan baru dan masalah khusus, ajukan pertanyaan SO terpisah yang merinci kode apa yang Anda coba yang tidak berfungsi daripada berkomentar di sini.
Mark Fisher
36

Lihat LayoutInflaterkelas.

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup parent = (ViewGroup)findViewById(R.id.where_you_want_to_insert);
inflater.inflate(R.layout.the_child_view, parent);
Gabriel Negut
sumber
bagaimana cara menambahkan onClicklistener ke pandangan individu yang meningkat. Tolong berikan cuplikan
Sagar Devanga
14

Untuk membuat jawaban @Mark Fisher lebih jelas, tampilan yang dimasukkan akan meningkat menjadi file xml di bawah folder layout tetapi tanpa layout (ViewGroup) seperti LinearLayout dll. Di dalamnya. Contoh saya:

res / layout / my_view.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/i_am_id"
    android:text="my name"
    android:textSize="17sp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"/>

Kemudian, titik penyisipan harus berupa tata letak seperti LinearLayout:

res / layout / activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/aaa"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/insert_point"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </LinearLayout>

</RelativeLayout>

Maka kodenya harus

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shopping_cart);

    LayoutInflater inflater = getLayoutInflater();
    View view = inflater.inflate(R.layout.my_view, null);
    ViewGroup main = (ViewGroup) findViewById(R.id.insert_point);
    main.addView(view, 0);
}

Alasan saya memposting jawaban yang sangat mirip ini adalah bahwa ketika saya mencoba menerapkan solusi Mark, saya terjebak pada file xml apa yang harus saya gunakan untuk insert_point dan tampilan anak. Saya menggunakan tata letak di tampilan anak pertama dan itu benar-benar tidak berfungsi, yang saya butuh beberapa jam untuk mencari tahu. Jadi harap eksplorasi saya dapat menghemat waktu orang lain.

York Yang
sumber
@York Yang bagaimana saya bisa mendapatkan Id of of vies ditambahkan di sini jika kita menambahkan lebih dari satu tampilan menggunakan for loop.
Rahul Kushwaha
5
// Parent layout
LinearLayout parentLayout = (LinearLayout)findViewById(R.id.layout);

// Layout inflater
LayoutInflater layoutInflater = getLayoutInflater();
View view;

for (int i = 1; i < 101; i++){
    // Add the text layout to the parent layout
    view = layoutInflater.inflate(R.layout.text_layout, parentLayout, false);

    // In order to get the view we have to use the new view with text_layout in it
    TextView textView = (TextView)view.findViewById(R.id.text);
    textView.setText("Row " + i);

    // Add the text view to the parent layout
    parentLayout.addView(textView);
}
Tienanhvn
sumber
1
Sementara cuplikan kode ini mungkin solusinya, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
yivi
Bagaimana saya bisa mendapatkan ID dari berbagai tampilan yang dibuat menggunakan For Loop.
Rahul Kushwaha