2011-01-27 28 views
76

मेरे पास टेक्स्टव्यू प्रोग्रामरेटिक रूप से लीनियरलायआउट में जोड़ा गया है और कुछ बाहरी घटनाओं पर मैं उस टेक्स्ट व्यू -10 के नीचे मार्जिन को कम करना चाहता हूं, जिसके लिए मैंने निम्नलिखित कोशिश की थी।टेक्स्ट व्यू के मार्जिन को कैसे बदलें

LinearLayout.LayoutParams lastTxtParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
lastTxtParams.setMargins(0, 0, 0, -10); 
mOldTextView.setLayoutParams(lastTxtParams); 
mOldTextView.invalidate(); 

क्या विजेट में मार्जिन को संशोधित करने का सही तरीका है जिसे देखने के लिए जोड़ा गया है?
कुछ कैसे काम नहीं कर रहे हैं।

उत्तर

5

setMargins() टेक्स्ट व्यू के INNER मार्जिन सेट करता है, लेआउट-मार्जिन नहीं। क्या आप यही करना चाहते हैं? यह दो अलग मार्जिन काफी जटिल हो सकते हैं।

यदि आप लेआउट मार्जिन सेट करना चाहते हैं, तो टेक्स्ट व्यू (textview.getLayoutParams() के लेआउट पैराम्स को बदलें, फिर लौटा लेआउटपैर ऑब्जेक्ट पर पैरामीटर बदलें)।

आपको अपने LinearLayout पर कुछ भी बदलने की आवश्यकता नहीं है।

सादर, ओलिवर

174
TextView forgot_pswrd = (TextView) findViewById(R.id.ForgotPasswordText); 
forgot_pswrd.setOnTouchListener(this);  
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
llp.setMargins(50, 0, 0, 0); // llp.setMargins(left, top, right, bottom); 
forgot_pswrd.setLayoutParams(llp); 

मैं इस किया था और यह पूरी तरह से काम किया। हो सकता है कि आप मूल्य में मूल्य दे रहे हैं, यही कारण है कि आपका कोड काम नहीं कर रहा है। आप बस यह कोड डालते हैं जहां आप दृश्य का संदर्भ बना रहे हैं।

+0

ठोस देखें। धन्यवाद ... – trgraglia

+0

इस कॉल को एपीआई स्तर की आवश्यकता है 19. –

+4

@ संजय कुमार - नहीं, इसमें कोई बाधा नहीं है कि इसे एपीआई स्तर 19 – Debarati

1

टेक्स्ट व्यू सेटमार्गिन का समर्थन नहीं करता है। Android docs कहें:

भले ही कोई दृश्य पैडिंग को परिभाषित कर सकता है, यह मार्जिन के लिए कोई समर्थन प्रदान नहीं करता है। हालांकि, समूह ऐसे समर्थन प्रदान करते हैं। अधिक जानकारी के लिए ViewGroup और ViewGroup.MarginLayoutParams का संदर्भ लें।

58

एक्सएमएल में आपका लेआउट शायद पहले से ही लेआउट_मार्गिन (बाएं | दाएं | आदि) विशेषता है, जिसका अर्थ है कि आपको उस एक्सएमएल द्वारा उत्पन्न ऑब्जेक्ट तक पहुंचने और इसे संशोधित करने की आवश्यकता है।

मैंने पाया इस समाधान बहुत सरल होने के लिए:

ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView 
     .getLayoutParams(); 

mlp.setMargins(adjustmentPxs, 0, 0, 0); 

break; 

, अपने TextView की LayoutParams उदाहरण जाओ MarginLayoutParams करने के लिए इसे खिन्न, और मार्जिन सेट करने के लिए setMargins विधि का उपयोग करें।

+0

यह मुझे क्लासकास्ट अपवाद देता है: -> ViewGroup.LayoutParams ViewGroup पर नहीं डाला जा सकता है। मार्जिनलेआउट पैराम्स –

10

यह एक मुश्किल समस्या है, मैं तालिका लेआउट की पंक्ति में टेक्स्टव्यू पर मार्जिन सेट करता हूं। नीचे देखें:

TableLayout tl = new TableLayout(this); 
tl.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

TableRow tr = new TableRow(this);   
tr.setBackgroundResource(R.color.rowColor); 

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
params.setMargins(4, 4, 4, 4); 

TextView tv = new TextView(this); 
tv.setBackgroundResource(R.color.textviewColor); 
tv.setText("hello"); 
tr.addView(tv, params); 

TextView tv2 = new TextView(this); 
tv2.setBackgroundResource(R.color.textviewColor); 
tv2.setText("hi"); 
tr.addView(tv2, params); 

tl.addView(tr); 
setContentView(tl); 

वर्ग एक तालिका पंक्ति में उपयोग के लिए LayoutParams के लिए आयात करने के लिए की जरूरत है:

import android.widget.**TableRow**.LayoutParams; 

रखना आवश्यक है कि मैं तालिका पंक्ति के लिए वर्ग गयी।

import android.widget.**RelativeLayout**.LayoutParams; 

आयात android.widget: इसी तरह कई अन्य वर्गों की तरह LayoutParams उपयोग करने के लिए उपलब्ध हैं। रैखिक लयआउट। लयआउट पैराम्स;

तो तदनुसार उपयोग करें।

0

आप इसे खींचे जाने के बाद लेआउट मार्जिन बदल रहे थे। mOldTextView.invalidate() बेकार है। आपको नई कॉन्फ़िगरेशन को रिलेआउट करने के लिए अभिभावक पर requestLayout() को कॉल करने की आवश्यकता है। जब आप ड्राइंग से पहले लेआउट बदलते कोड को ले जाते थे, तो सबकुछ ठीक काम करता था।

1

यहाँ एक और दृष्टिकोण है ...

जब मैं एक ही समस्या मिल गया है, मैं सुझाव दिया समाधान यहाँ पसंद नहीं आया। तो, मैं एक और तरीका है के साथ आ गया है: मैं दो क्षेत्रों मैं दो महत्वपूर्ण क्षेत्रों के साथ अलग करने के लिए करना चाहता था के बीच एक्सएमएल फ़ाइल में एक TextView डाला है:

  1. दृश्यता "गॉन" करने के लिए सेट (नहीं करता है किसी भी स्थान पर कब्जा नहीं है ..)
  2. ऊंचाई जो भी मुझे अलग होने की आवश्यकता है, पर सेट है।

    XML: 
    ...//some view up here 
    <TextView 
        android:id="@+id/dialogSeparator" 
        android:layout_width="match_parent" 
        android:layout_height="30dp" 
        android:visibility="gone"/> 
    ...//some view down here 
    
अब

, मैं कोड, सब मैं करने के लिए यह आसान परिवर्तन दृश्यता करने के लिए की जरूरत अदृश्य (यानी यह वहाँ है, और जरूरत स्थान नहीं ले रहा है, लेकिन यह अनदेखी है)

JAVA: 

    TextView tvSeparator = (TextView)activity.findViewById(R.id.dialogSeparator); 
    tvSeparator.setVisibility(View.INVISIBLE); 
    //Inside an activity extended class I can use 'this' instead of 'activity'. 

व्हायोला ... मुझे आवश्यक मार्जिन मिला। बीटीडब्ल्यू, यह समाधान लंबवत अभिविन्यास के साथ LinearLayout के लिए है, लेकिन आप इसे विभिन्न लेआउट के साथ कर सकते हैं।

उम्मीद है कि इससे मदद मिलती है।

0
 TextView tv = (TextView)findViewById(R.id.item_title)); 
     RelativeLayout.LayoutParams mRelativelp = (RelativeLayout.LayoutParams) tv 
        .getLayoutParams(); 
     mRelativelp.setMargins(DptoPxConvertion(15), 0, DptoPxConvertion (15), 0); 
     tv.setLayoutParams(mRelativelp); 

    private int DptoPxConvertion(int dpValue) 
    { 
     return (int)((dpValue * mContext.getResources().getDisplayMetrics().density) + 0.5); 
    } 

getLayoutParams() TextView की एक्सएमएल में TextView की जनक के आधार पर इसी पैरामीटर के लिए casted किया जाना चाहिए।

<RelativeLayout> 
    <TextView 
    android:id="@+id/item_title"> 
</RelativeLayout> 

विभिन्न उपकरणों पर ही वास्तविक आकार प्रदान करने के लिए DptoPxConvertion() विधि जो मैं ऊपर का इस्तेमाल किया है का उपयोग करें। setMargin (बाएं, ऊपर, दाएं, नीचे) पैराम मानों को पिक्सेल में डीपी में नहीं ले जाएगा। आगे के संदर्भ के लिए यह Link Answer

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