Android - गतिशील रूप से दृश्य में दृश्य जोड़ें


148

मेरे पास एक दृश्य के लिए एक लेआउट है -

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

मैं क्या करना चाहता हूं, इस तरह के लेआउट के साथ मेरी मुख्य गतिविधि में है

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

मैं अपने डेटा मॉडल के माध्यम से लूप करना चाहता हूं और पहले लेआउट के मुख्य लेआउट में शामिल कई दृश्यों को इंजेक्ट करना चाहता हूं। मुझे पता है कि मैं कोड के भीतर पूरी तरह से नियंत्रणों का निर्माण करके ऐसा कर सकता हूं, लेकिन मैं सोच रहा था कि क्या गतिशील रूप से विचारों को बनाने का कोई तरीका था ताकि मैं कोड में सब कुछ डालने के बजाय एक लेआउट का उपयोग करना जारी रख सकूं।


जवाबों:


230

LayoutInflaterअपने लेआउट टेम्प्लेट के आधार पर एक दृश्य बनाने के लिए उपयोग करें , और फिर इसे उस दृश्य में इंजेक्ट करें जहां आपको इसकी आवश्यकता है।

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

आपको उस अनुक्रमणिका को समायोजित करना पड़ सकता है जहाँ आप दृश्य सम्मिलित करना चाहते हैं।

इसके अतिरिक्त, लेआउटपार्म्स को इस हिसाब से सेट करें कि आप इसे पैरेंट व्यू में कैसे फिट करना चाहते हैं। जैसे FILL_PARENT, या MATCH_PARENT, आदि।


2
यह वह जगह है जहाँ आप कभी भी गतिशील रूप से उत्पन्न लेआउट को अपने मुख्य दृश्य में रखना चाहते हैं। यह बिट आपको अपने कोड से भरना है।
मार्क फिशर

उन लोगों के लिए जो अब इसे आज़माना चाहते हैं - पहली पंक्ति में दिखाए गए लेआउट फ़्लोटर अभी भी हल करता है, लेकिन काम करने के लिए प्रकट नहीं होता है, इसके बजाय उपयोग करेंgetLayoutInflater()
ब्रेंडन

2
LayoutInflater vi = getLayoutInflater();गतिविधि से बचाने के लिए गतिविधि का उपयोग करें जो आपको अन्यथा नहीं मिलती है।
akarthik10

1
@MrG आपको SO पर एक अलग प्रश्न उठाना चाहिए। यह प्रश्न टुकड़ों को गतिशील रूप से बनाने के बारे में है, न कि विचारों के बारे में।
मार्क फिशर

2
@ यदि आपके पास एक नया प्रश्न और विशिष्ट मुद्दा है, तो एक अलग SO प्रश्न बढ़ाएं कि आपने कौन सा कोड आज़माया है जो यहां टिप्पणी करने के बजाय काम नहीं कर रहा है।
मार्क फिशर

36

LayoutInflaterकक्षा देखें ।

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

मैं उन लोगों के विचारों को कैसे जोड़ सकता हूं जो फुलाए गए थे। कृपया एक स्निपेट प्रदान करें
सागर देवांग

20

ऐसा लगता है कि आप निर्दिष्ट लेआउट को बढ़ाने के लिए कस्टम एडाप्टर के साथ वास्तव में एक सूची दृश्य क्या चाहते हैं। एक ArrayAdapter और विधि का उपयोग करके notifyDataSetChanged()आपके पास दृश्य पीढ़ी और रेंडरिंग का पूर्ण नियंत्रण है।

इन ट्यूटोरियल पर एक नज़र डालें


14

@ मर्क फिशर के उत्तर को और अधिक स्पष्ट करने के लिए, डाला जा रहा दृश्य को लेआउट फ़ोल्डर के तहत एक xml फ़ाइल होना चाहिए, लेकिन बिना लेआउट (ViewGroup) जैसे कि LinearLayout आदि के अंदर। मेरा उदाहरण:

रेस / लेआउट / 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"/>

फिर, सम्मिलन बिंदु को LinearLayout जैसा लेआउट होना चाहिए:

रेस / लेआउट / 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>

फिर कोड होना चाहिए

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

इसका कारण मैं इसी तरह का उत्तर देता हूं कि जब मैंने मार्क के समाधान को लागू करने का प्रयास किया, तो मैं इस बात पर अड़ गया कि मुझे कौन सी xml फाइल को insert_point और बच्चे के दृश्य के लिए उपयोग करना चाहिए। मैंने पहले बच्चे के दृश्य में लेआउट का उपयोग किया था और यह पूरी तरह से काम नहीं कर रहा था, जिससे मुझे यह पता लगाने में कई घंटे लग गए। इसलिए उम्मीद है कि मेरी खोज दूसरों के समय को बचा सकती है।


अगर हम लूप का उपयोग करके एक से अधिक दृश्य जोड़ते हैं, तो योरक यांग मैं ईद की वीड्स को यहां कैसे जोड़ सकता हूं।
राहुल कुशवाहा

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

1
हालांकि यह कोड स्निपेट समाधान हो सकता है, जिसमें स्पष्टीकरण भी शामिल है , जो आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
yivi

मैं फॉर लूप का उपयोग करके बनाए गए विभिन्न विचारों का आईडी कैसे प्राप्त कर सकता हूं।
राहुल कुशवाहा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.