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




android view (7)

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

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 पास करते हैं तो यह काम नहीं करता है।

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


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

आप LinearLayout.LayoutParams ऑब्जेक्ट पर setMargins() को कॉल setMargins()

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

LinearLayout.LayoutParams documentation में संकेत के अनुसार, LinearLayout.LayoutParams का एक उप-वर्ग है।

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

नहीं।

यह पहला एंड्रॉइड लेआउट कार्य नहीं होगा जो आप केवल एक्सएमएल में कर सकते हैं

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

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


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

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

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

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

डिवाइस स्क्रीन पिक्सेल घनत्व में भिन्नता के कारण प्रोग्रामिंग के मार्जिन सेट करने के लिए हमेशा 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); 

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


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

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));

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

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

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


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

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





margin