Android - Görünümleri Görünüme Dinamik Olarak Ekleme


149

Görünüm için bir düzenim var -

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

Yapmak istediğim, ana faaliyetimde böyle bir düzen ile

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

Veri modelimde döngü yapmak ve ilk düzenden oluşan birden çok görünümü ana düzene enjekte etmek istiyorum. Kontrolleri tamamen kod içinde oluşturarak bunu yapabileceğimi biliyorum, ancak her şeyi koda koymak yerine bir düzen kullanmaya devam edebilmek için görünümleri dinamik olarak oluşturmanın bir yolu olup olmadığını merak ediyordum.


Yanıtlar:


235

LayoutInflaterYerleşim şablonunuza göre bir görünüm oluşturmak için kullanın ve ardından bunu ihtiyacınız olan görünüme enjekte edin.

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

Görünümü eklemek istediğiniz dizini ayarlamanız gerekebilir.

Ek olarak, LayoutParams'ı ana görünüme nasıl sığdırmak istediğinize göre ayarlayın. ör. FILL_PARENT, veya MATCH_PARENTvb.


2
dinamik olarak oluşturulmuş düzeni ana görünümünüze yerleştirmek istediğiniz yer burasıdır. kendi kodunuzdan doldurmanız gereken kısım budur.
Mark Fisher

Bunu şimdi denemek isteyenler için - ilk satırda gösterildiği gibi elde edilen düzen şişirici hala çözülüyor ancak işe yaramıyor, bunun yerinegetLayoutInflater()
Brendan

2
LayoutInflater vi = getLayoutInflater();Başka türlü elde edemeyeceğiniz etkinlik temasını korumak için bir etkinlikten kullanın .
akarthik10

1
@MrG SO konusunda ayrı bir soru sormalısınız. Bu soru, parçalar hakkında değil, dinamik olarak görünümlerin nasıl oluşturulacağıyla ilgilidir.
Mark Fisher

2
@Arsh Yeni bir sorunuz ve belirli bir sorununuz varsa, burada yorum yapmak yerine denediğiniz kodun çalışmadığını ayrıntılarıyla anlatan ayrı bir SO sorusu sorun.
Mark Fisher

36

LayoutInflaterSınıfa bakın .

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

şişirilmiş birey görünümlerine onClicklistener'ı nasıl eklerim.Lütfen bir pasaj sağlayın
Sagar Devanga


14

@Mark Fisher'in cevabını daha net hale getirmek için, şişirilen eklenen görünüm, layout klasörü altında bir xml dosyası olmalı, ancak içinde LinearLayout vb. Örneğim:

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

Ardından, ekleme noktası LinearLayout gibi bir düzen olmalıdır:

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>

O zaman kod olmalı

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

Bu çok benzer cevabı göndermemin nedeni, Mark'ın çözümünü uygulamaya çalıştığımda, insert_point ve child view için hangi xml dosyasını kullanmam gerektiğine takılıp kaldım. Öncelikle çocuk görünümünde düzen kullandım ve tamamen çalışmıyordu, bu da benim çözmem birkaç saatimi aldı. Umarım keşiflerim başkalarının zamanını kurtarır.


@York Yang, for döngüsünü kullanarak birden fazla görünüm eklersek, buraya kimliklerin eklenmesini nasıl sağlayabilirim.
Rahul Kushwaha

6
// 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);
}

1
Bu kod parçacığı çözüm olabilir, ancak bir açıklama da dahil olmak üzere yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtlayacağınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın.
yivi

For Loop kullanılarak oluşturulan farklı görünümlerin kimliklerini nasıl alabilirim.
Rahul Kushwaha
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.