2017-02-14 7 views
7

मैं एक सामान्य दृश्य:एंड्रॉयड मार्जिन काम नहीं कर रहा है जब गतिशील डालने विचारों

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/contact_selected" 
    android:layout_marginTop="10dp" 
    android:layout_marginEnd="5dp" 
    android:orientation="horizontal" 
    android:padding="3dp"> 
    <TextView 
     android:id="@+id/txt_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Billy Bob" 
     /> 
</LinearLayout> 

जब मैं स्थिर मेरी मुख्य गतिविधि लेआउट में LinearLayout मार्कअप कॉपी, मार्जिन उम्मीद कर रहे हैं के रूप में। हालांकि, जब मैं गतिशील रूप से मुख्य गतिविधि लेआउट में दृश्य जोड़ता हूं, मार्जिन को अनदेखा कर दिया जाता है।

enter image description here

मुख्य लेआउट में कंटेनर एक LinearLayout है, जो एक HorizontalScrollView का एक बच्चा है है: यहाँ मैं कैसे दृश्य

LayoutInflater inflater = (LayoutInflater) 
     getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View view = inflater.inflate(R.layout.test, null); 
TextView txt_title = (TextView)view.findViewById(R.id.txt_title); 
txt_title.setText("DynamiC#1"); 
llayout.addView(view, llayout.getChildCount()-1); 

View view2 = inflater.inflate(R.layout.test, null); 
txt_title = (TextView)view2.findViewById(R.id.txt_title); 
txt_title.setText("DynamiC#2"); 
llayout.addView(view2, llayout.getChildCount()-1); 

डालने यहाँ यह क्या लगता है कि है। किसी भी अंतर्दृष्टि की सराहना की है।

उत्तर

14

जब गतिशील रूप से विचार जोड़ते हैं, तो आपको को nullViewGroup अभिभावक के साथ फुलाया नहीं जाना चाहिए। तो, दूसरे शब्दों में आपको inflater.inflate(R.layout.test, linearLayout, false); का उपयोग करना चाहिए। यह निर्धारित करते समय माता-पिता का उपयोग किस प्रकार के लेआउट पैरामीटर उत्पन्न करने के लिए किया जाता है। अपने मूल कंटेनर को पास करें (इस मामले में, आपका रैखिक लेआउट), इसलिए यह आपके एक्सएमएल से ViewGroup.MarginLayoutParams को सही ढंग से चालू करता है।

+0

धन्यवाद, यह एक साफ समाधान है, और यह करने का मेरा पसंदीदा तरीका है। इस सामान को सीखने वाले किसी और के लिए, ध्यान दें कि क्योंकि (देखें, पैरेंट) पैरेंट (माता-पिता के रूप में जोड़ता है) में दृश्य को बढ़ाता है, मेरे टेस्ट कोड में लाइन जहां मैं दृश्य जोड़ता हूं (यानी llayout.addView()) कारण एक त्रुटि क्योंकि दृश्य पहले ही डाला जा चुका है। मेरे मामले में मुझे अंतिम बच्चे के रूप में एक निश्चित दृश्य बनाए रखने की आवश्यकता है, और इसके सामने नए बच्चों को डालने की आवश्यकता है। इसलिए मैं inflate() से पहले अपना अंतिम दृश्य हटा देता हूं और inflate() के बाद इसे वापस जोड़ता हूं। एक जादू की तरह काम करता है। –

+0

@ जॉनवार्ड वास्तव में आपको अभी भी addView की आवश्यकता है यदि आप उस अंतिम बूलियन पैरामीटर के साथ "inflater.inflate (R.layout.test, linearLayout, false)" का उपयोग करते हैं। – Flyview

2

ऐसा इसलिए होता है क्योंकि आपको "मार्जिन" गतिशील रूप से लेआउट देने की आवश्यकता है। यहाँ

LinearLayout ll = new LinearLayout(this); 
ll.setOrientation(LinearLayout.VERTICAL); 

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
layoutParams.setMargins(30, 20, 30, 0); 

, आप LayoutParams LinearLayout को सेट कर सकते हैं:

ll.addView(okButton, layoutParams); 

आशा है कि यह मदद करता है -: आप, "LayoutPrams" की एक वस्तु बनाने इस तरह से कर सकते हैं।

+0

धन्यवाद। एक और एंड्रॉइड रहस्य हल हो गया! –

+0

मुझे खेद है, लेकिन मैं Submersed द्वारा प्रदान किए गए एक को स्वीकृत उत्तर बदल रहा हूं। आपका जवाब उपयोगी था और मुझे कुछ सिखाया जो मुझे नहीं पता था, लेकिन उसका जवाब क्लीनर है और मुझे मार्जिन के लिए कैल्क डिप करने के लिए मजबूर नहीं करता है। एक बार फिर धन्यवाद। –

+0

आपकी प्रतिक्रिया जॉन के लिए धन्यवाद। –

0

सबसे पहले, आपको प्रदर्शन घनत्व प्राप्त करना होगा। संबंधित दस्तावेज़ https://developer.android.com/reference/android/util/DisplayMetrics.html

और आईडी प्राप्त करें जिसे आप मार्जिन व्यू सेट करना चाहते हैं। मेरे मामले के लिए ,

layout_login_box = (ConstraintLayout)findViewById(R.id.login_layout_box); 

float density = getResources().getDisplayMetrics().density; 

ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams)layout_login_box.getLayoutParams(); 
params.setMargins((int) (24 * density),0,(int) (24 * density),(int) (16 * density)); 
layout_login_box.setLayoutParams(params); 

इसके अलावा, आप अपने खुद के दृश्य पर ConstraintLayout बदल सकते हैं।

संबंधित मुद्दे