TextView का मार्जिन कैसे बदलें


82

मेरे पास Textear को LinearLayout में प्रोग्रामेटिक रूप से जोड़ा गया है और कुछ बाहरी घटनाओं पर मैं उस TextView के निचले मार्जिन को -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();

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

जवाबों:


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

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


इस कॉल के लिए एपीआई स्तर 19 की आवश्यकता है।
— संजय कुमार

4
@ संजयकुमार - नहीं, कोई अड़चन नहीं है कि इसके लिए एपीआई स्तर 19 की आवश्यकता है
— देबरती

1
यह ओपी के सवाल का जवाब कैसे देता है? ऐसा लगता है कि कोड समान है, केवल अतिरिक्त अतिरिक्त लाइन सेटिंग टच श्रोता को छोड़कर, अमान्य नहीं कह रहा है (), और स्पष्ट रूप से LinearLayout.LayoutParams [LayoutParams.WRR__Content vs LinearLayout.LayoutParams.WRAP_Content] के निर्माण में तर्क नहीं बता रहा है? इसके अलावा (ऐसा नहीं है कि यह कोई बात नहीं कर सकता), ओपी प्रोग्रामव्यू पर बनाए गए मार्जिन को टेक्स्ट व्यू के लिए सेट करने के लिए कह रहा है, हालांकि इसका जवाब लेआउट व्यू एमएल से टेक्स्ट व्यू को फाइंड व्यूबायड () के माध्यम से मिलता है। मैं उत्सुक हूँ कि मैं यहाँ क्या याद कर रहा हूँ ...
— मेल्कियड्स

@Melquiades आपके साथ सहमत है, चयनित उत्तर के रूप में हटा दिया गया क्योंकि यह प्रश्न का उत्तर नहीं देता है, जैसा कि उत्तर Maybe as you are giving the value in -veमार्जिन में उल्लेख किया गया है, एक -ve मान हो सकता है।
— यूजर7723337

61

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

मुझे यह समाधान बहुत सरल लगा:

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

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

break;

अपने टेक्स्टव्यू का लेआउटपार्म्स उदाहरण प्राप्त करें, इसे मार्जिनगुटआउटप्रेमों में डाउनकास्ट करें, और मार्जिन सेट करने के लिए सेटमार्जन्स विधि का उपयोग करें।


यह मुझे ClassCastException देता है: -> ViewGroup.LayoutParams ViewGroup.MarginLayoutParams में नहीं डाल सकता है
— हर्षिल पानसरे

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

तालिका पंक्ति में उपयोग के लिए लेआउटपैरम के आयात के लिए आवश्यक वर्ग है:

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

ध्यान दें कि मैंने तालिका पंक्ति के लिए वर्ग जोड़ा है। इसी तरह कई अन्य कक्षाएं लेआउटपारम्स का उपयोग करने के लिए उपलब्ध हैं जैसे:

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

आयात android.widget। LinearLayout .LayoutParams;

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


5

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

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

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

सादर, ओलिवर


3

TextView सेटमैरिज का समर्थन नहीं करता है। Android डॉक्स कहते हैं:

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


1

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

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

  1. दृश्यता "GONE" पर सेट की गई है (किसी स्थान पर कब्जा नहीं करता है ..)
  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'.

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

उम्मीद है की यह मदद करेगा।


0

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


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 () का टेक्स्टव्यू एक्सएमएल में टेक्स्टव्यू के जनक के आधार पर संबंधित पारमेस को डाला जाना चाहिए ।

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

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

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