प्रोग्रामेटिकली व्यूज को व्यूज में कैसे जोड़ें


179

मान लीजिए कि मेरे पास LinearLayoutजावा कोड से मेरे कार्यक्रम में एक है , और मैं इसे एक दृश्य जोड़ना चाहता हूं। इसके लिए किस विधि का उपयोग किया जाता है? मैं यह नहीं पूछ रहा हूं कि यह XML में कैसे किया जाता है, जो मुझे पता है, लेकिन इसके बजाय, मैं इस नमूना कोड की तर्ज पर कुछ कैसे कर सकता हूं?

(One View).add(Another View)

जैसे कोई स्विंग में कर सकता है।

जवाबों:


248

कॉलिंग addViewसही उत्तर है, लेकिन आपको इसे काम करने के लिए थोड़ा और करने की ज़रूरत है।

यदि आप एक निर्माणकर्ता (उदाहरण के लिए Button myButton = new Button();) के माध्यम से एक दृश्य बनाते हैं , तो आपको setLayoutParamsअपने नवनिर्मित बच्चे को माता-पिता के दृश्य में जोड़ने से पहले, माता-पिता के लेआउटचित्र आंतरिक वर्ग की एक आवृत्ति में गुजरते हुए, नवनिर्मित दृश्य पर कॉल करना होगा ।

उदाहरण के लिए, आपके onCreate()फ़ंक्शन में निम्नलिखित कोड हो सकते हैं मान लें कि आपका LinearLayout आईडी है 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);

लेआउटपार्म्स सेट करना महत्वपूर्ण है। हर दृश्य को कम से कम एक लेआउट_ एक्सपोज़र और एक लेआउट_हाइट पैरामीटर की आवश्यकता होती है। इसके अलावा सही आंतरिक वर्ग प्राप्त करना महत्वपूर्ण है। जब तक मुझे यह पता नहीं चला कि मैं टेबलट्रॉ से जुड़ गया हूं, तब तक मैं ठीक से प्रदर्शित होने के लिए संघर्ष कर रहा था जब तक मुझे पता नहीं चल गया था कि मैं TableRow.LayoutParams का एक दृश्य बाल दृश्य सेटलैटआउट में नहीं कर रहा हूं।


5
आप प्रोग्राम को प्रोग्रामेटिक रूप से कैसे बनाएंगे लेकिन XML लेआउट फ़ाइल का उपयोग करके आपने विशेष रूप से इस नए दृश्य के लिए लिखा है?
SK9

9
@ SK9 आप एक LayoutInflater का उपयोग करेंगे, जो आप एक संदर्भ से प्राप्त कर सकते हैं, आमतौर पर वर्तमान गतिविधि। कुछ इस तरह से: LayoutInflater myInflater = getLayoutInflater; MyView = myInflater.inflate (R.layout.myLayout, parent, false) देखें;
ब्रायन कूली

1
वास्तव में getLayoutInflater () विंडो क्लास (कॉन्टेक्ट नहीं) से आता है, और यह एक्टिविटी में एक सुविधा विधि है।
ब्रायन कूली

2
एक कोडिंग अभ्यास के रूप में, findViewById पर, ViewGroup या हमेशा किसी ऑब्जेक्ट का सबसे सामान्य रूप कास्ट किया जाता है ताकि अगर यह LinearLayout से RelativeLayout में बदल जाए, तो आपके पास कोई रिफैक्टिंग नहीं है।
जोएल टेपली

1
ये कुछ विवरण हैं: D
विवेक सोलंकी

51

अभी तक किसी के लिए भी:

मुझे मिलने वाला सबसे अच्छा तरीका दृश्य की फुलाए हुए स्थिर विधि का उपयोग करना है।

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

जहाँ आपकाViewXML R.layout.myView जैसा है

कृपया ध्यान दें कि एक दृश्य जोड़ने के लिए आपको एक ViewGroup की आवश्यकता है (जो कि कोई भी लेआउट जिसे आप सोच सकते हैं)

एक उदाहरण के रूप में आपको यह बताने की सुविधा है कि यह एक टुकड़ा है जिसे यह पहले से ही फुलाया गया है और आप जानते हैं कि मूल दृश्य एक लेआउट है, और आप इसमें एक दृश्य जोड़ना चाहते हैं:

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

आप एक स्थैतिक विधि भी लिख सकते हैं, ऐसा कुछ जो आपके जैसे addView(View v){ // your code after get view }उपयोग findViewById(int resourceID)या फुलाया हुआ पाया जाएगा inflatedView... बस अपने टुकड़े उदाहरण पर विस्तार करना है।
zgc7009

22

यह देर हो चुकी है लेकिन इससे किसी को मदद मिल सकती है :) :) दृश्य जोड़ने के लिए प्रोग्रामेटिक रूप से प्रयास करें

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

यह आपके पूरे दृश्य को प्रोग्रामेटिक रूप से बनाएगा। आप किसी भी संख्या को समान रूप से जोड़ सकते हैं। आशा है कि यह मदद कर सकता है। :)



3

गतिविधि से दृश्य जोड़ने का एक और तरीका

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

0

प्रोग्रामेटिक रूप से अवरोध स्थापित करने का विचार थकाऊ हो सकता है। नीचे दिया गया यह समाधान किसी भी लेआउट के लिए काम करेगा, चाहे बाधा, रैखिक, आदि। सबसे अच्छा तरीका एक प्लेसहोल्डर सेट करना होगा (फ्रेमलेयआउट उचित बाधाओं के साथ (या रैखिक में अन्य लेआउट में उचित स्थान) जहां आप उस प्रोग्रामर द्वारा बनाए गए दृश्य की उम्मीद करेंगे। रखने के लिए।

आपको बस इतना करने की ज़रूरत है कि दृश्य को प्रोग्रामेटिक रूप से फुलाएं और यह एक बच्चे के रूप में फ़्रेमलैटआउट का उपयोग करके addChild()विधि है। फिर रनटाइम के दौरान आपके विचार को फुलाया जाएगा और सही स्थिति में रखा जाएगा। Android अनुशंसा के अनुसार, आपको केवल एक ही बच्चा दृश्य फ्रेमलेयूट [लिंक] में जोड़ना चाहिए ।

यहां आपका कोड कैसा दिखेगा, यह मानकर कि आप किसी विशेष स्थान पर TextView प्रोग्राम बनाना चाहते हैं:

चरण 1:

आपके लेआउट में, जिसमें दृश्य को फुलाया जाना है, एक फ्रेमलैट को सही स्थिति में रखें और इसे एक आईडी दें, कहें, "कंटेनर"।

चरण 2 रूट तत्व के साथ एक लेआउट बनाएं, जिस दृश्य को आप रनटाइम के दौरान फुलाते हैं, लेआउट फ़ाइल को "textview.lml" के रूप में कॉल करें:

<?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, अपने फ्रेम के लेआउट-पैरामेट्स को सेट करें हमेशा लपेटें_कंट के लिए और फिर फ्रेम लेआउट माता-पिता के रूप में बड़ा हो जाएगा अर्थात गतिविधि यानी फोन स्क्रीन।

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

यदि सेट नहीं किया गया है, क्योंकि फ़्रेम का एक बच्चा दृश्य, डिफ़ॉल्ट रूप से, फ़्रेम लेआउट के बाएँ-शीर्ष पर जाता है, इसलिए आपका दृश्य बस स्क्रीन के बाएँ शीर्ष पर जाएगा।

चरण 3

अपने ऑनक्रीट विधि में, यह करें:

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

(नोट के अंतिम पैरामीटर है कि findViewByIdकरने के लिए nullफोन करके और देखने जोड़ने addView()कंटेनर दृश्य (frameLayout) पर बस पास करके फुलाया दृश्य संलग्न रूप में ही है trueकी 3 पैरामीटर में findViewById()। अधिक के लिए, देखें इस ।)


0

आप लोग यह भी सुनिश्चित करें कि जब आप सभी संपत्तियों के साथ onLayoutकॉल करने के लिए ओवरराइड करेंगे super.onLayout, या दृश्य फुलाया नहीं जाएगा!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.