रैखिक रूप से प्रोग्राम में मार्जिन सेट करें


266

मैं जावा ( एक्सएमएल नहीं ) का उपयोग करने की कोशिश कर रहा हूं ताकि स्क्रीन को भरने वाले बटन के साथ एक लिनियरलाईट बनाया जा सके, और मार्जिन हो। यहाँ वह कोड है जो बिना मार्जिन के काम करता है:

LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
    Button btn = new Button(this);
    btn.setText("A");

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
    lp.weight = 1.0f; // This is critical. Doesn't work without it.
    buttonsView.addView(btn, lp);
}

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);

तो यह ठीक काम करता है, लेकिन आप धरती पर कैसे बटन बटन देते हैं ताकि उनके बीच जगह हो? मैंने प्रयोग करने की कोशिश की LinearLayout.MarginLayoutParams, लेकिन इसका कोई weightसदस्य नहीं है इसलिए यह अच्छा नहीं है। और यह काम नहीं करता है यदि आप इसे lpइसके निर्माता में पास करते हैं या तो।

क्या यह असंभव है? क्योंकि यह सुनिश्चित है कि यह दिखता है, और यह पहला Android लेआउट कार्य नहीं होगा जिसे आप केवल XML में कर सकते हैं।


1
डेवलपर .android.com/reference/android/view/…, int, int, int) लेआउट के बजाय। Pamsams.setMargins (30, 20, 30, 0); आप लेआउट डालते हैं। Parsams.setMargins (30dp, 20dp, 30dp, 0dp);
डार्थस्टैडर

3
सेटमार्जन्स तर्कों के रूप में int लेता है .. आप केवल xml का प्रयोग करके "dp" प्रदान कर सकते हैं
jyavenard

जवाबों:


496

इसे पूरा करने के लिए यहां एक छोटा कोड दिया गया है:

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

Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);

6
एक-टू-द-पॉइंट कोड नमूने के लिए धन्यवाद - जिस तरह से केवल विवरणों से अधिक फायदेमंद है
कोई व्यक्ति

25
ऐसा लग रहा है कि पिक्सल में मार्जिन परमेस सेट हैं। डीपीएस में उन्हें सेट करने का कोई तरीका?
आर्टेम रसाकोवस्की

30
@ArtemRussakovskii Android में अधिकांश कार्यों की तरह, वे पिक्सेल लेते हैं। मैं एक वैश्विक उपयोगिता फ़ंक्शन का सुझाव देता हूं जो dx को px में परिवर्तित करता है। यह मैंने अपने सभी ऐप में किया है। Android API बेकार है।
mxcl 12

7
@MaxHowell कि मैं क्या कर रहा है। यह अविश्वसनीय है कि बुनियादी चीजें जैसे कभी-कभी गायब होती हैं।
आर्टेम रसाकोवस्की

5
@ArtemRussakovskii - DIP को PX में बदलने के लिए TypedValue.applyDimension (...) का उपयोग करें। देखें stackoverflow.com/questions/2238883/…
गौतम

64

तो यह ठीक काम करता है, लेकिन आप धरती पर कैसे बटन बटन देते हैं ताकि उनके बीच जगह हो?

आप वस्तु setMargins()पर कॉल करें LinearLayout.LayoutParams

मैंने LinearLayout.MarginLayoutParams का उपयोग करने की कोशिश की, लेकिन इसका कोई वजन सदस्य नहीं है इसलिए यह अच्छा नहीं है।

LinearLayout.LayoutParamsके उपवर्ग के LinearLayout.MarginLayoutParamsरूप में प्रलेखन में संकेत दिया गया है ।

क्या यह असंभव है?

नहीं।

यह पहला Android लेआउट कार्य नहीं होगा जिसे आप केवल XML में कर सकते हैं

इस दावे के सबूत देने के लिए आपका स्वागत है।

व्यक्तिगत रूप से, मैं ऐसी किसी भी चीज़ से अनजान हूँ जो केवल XML के माध्यम से पूरी हो सकती है और SDK में जावा विधियों के माध्यम से नहीं। वास्तव में, परिभाषा के अनुसार, सब कुछ जावा (हालांकि जरूरी एसडीके-पहुंच योग्य तरीकों के माध्यम से) के माध्यम से संभव नहीं है, क्योंकि एक्सएमएल निष्पादन योग्य कोड नहीं है। लेकिन, अगर आप किसी चीज़ के बारे में जानते हैं, तो इसे इंगित करें, क्योंकि एसडीके में एक बग है जो किसी दिन तय होना चाहिए।


2
हा, ठीक है अब मैं समझ गया। लेआउट सिस्टम में थोड़ा खो गया था जो जटिल है। मुझे नहीं लगता कि रनवे पर लेआउट_विग्रथ / ऊंचाई सेट करने के लिए वैसे भी है।
टिम्मम्म

2
और स्टाइल सेट करने का कोई तरीका नहीं है: stackoverflow.com/questions/2016249/…
Timmmm

1
मुझे रनटाइम के दौरान चौड़ाई और ऊंचाई निर्धारित करने में कोई समस्या नहीं है LayoutPararms। मैं शैलियों का ... हाँ, ठीक है, वहाँ एक कारण है कि मैं उन्हें इस्तेमाल नहीं कर रहा हूँ। :-)
कॉमन्सवेयर

6
मैं यह जानना चाहता हूं कि यह ऐसा पीआईटीए है जो प्रोग्रामेटिक रूप से एक यूआई पैदा करता है
कोई कहीं

3
मुझे महसूस करने के लिए उम्र ले लिया, कि कुछ दिन पहले मैं गलत लेआउटपार्टम आयात करता था जो मार्जिन का समर्थन नहीं करता था ... इन उत्तरों को पढ़कर मैंने अपने आयात को हटाने का फैसला किया। 10 से अधिक विकल्प हैं D: मैं linearLayout.LayoutParams के लिए गया था। काम करता है।
१२:१२ को १२:१२

31

आइटमों में सीधे मार्जिन जोड़ने के लिए (कुछ आइटम मार्जिन के सीधे संपादन की अनुमति देते हैं), आप कर सकते हैं:

LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
    ((MarginLayoutParams) lp).topMargin = ...;
    ((MarginLayoutParams) lp).leftMargin = ...;
    //... etc
}
else
    Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );

... यह आसपास के लेआउट के बारे में जानने / संपादित करने की आवश्यकता के बिना काम करता है। यदि आप कोशिश करते हैं और मार्जिन का समर्थन नहीं करते हैं, तो इसके खिलाफ "इंस्टाफॉफ" चेक नोट करें।


2
बिल्कुल इसकी मुझे तलाश है।
djdance

21

डिवाइस स्क्रीन पिक्सेल विविधता में भिन्नता के कारण हमेशा DIPप्रोग्राम को व्यवस्थित रूप से सेट करने के लिए यूनिट का उपयोग करना अच्छा होता है। नीचे की तरह_

//get resources
Resources r = getResources();
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());

//get layout params...
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));

//set margin...
yourLayoutTOsetMargin.setLayoutParams(params); 

आशा है कि यह मदद करेगा।


10

मैंने सीधे नीचे दिए गए कोड का उपयोग करके मार्जिन सेट किया है

LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);            
params.setMargins(3, 300, 3, 3); 
layout.setLayoutParams(params);

यहां केवल यह ध्यान देना है कि LayoutParamsनिम्नलिखित पैकेज के लिए आयात किया जाना चाहिए android.widget.RelativeLayout.LayoutParams, अन्यथा कोई त्रुटि होगी।


7

इसे इस्तेमाल करे

 LayoutParams params = new LayoutParams(
            LayoutParams.WRAP_CONTENT,      
            LayoutParams.WRAP_CONTENT
    );
    params.setMargins(left, top, right, bottom);
    yourbutton.setLayoutParams(params);

7
 MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
 layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);

2
“जबकि यह कोड प्रश्न का उत्तर दे सकता है, यहाँ कोड की व्याख्या को शामिल करना बेहतर है।
xenteros

4

इसे इस्तेमाल करे:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;

3
/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

आपको दृश्य के प्रकार के समूह के वेयरहाउस होने चाहिए। ऊपर दिए गए कोड में, उदाहरण के लिए, मैं फ्रेमलैट के मार्जिन को बदलना चाहता हूं, और फ्रेमलैट का दृश्य समूह एक RelativeLayout है , इसलिए आपको (RelativeLayout.LayoutParams) को गुप्त करना होगा।


0

यहाँ एक लाइन समाधान:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.