में इस , यह और यह धागा मैं कैसे एक ही दृश्य पर मार्जिन सेट करने के लिए पर एक जवाब खोजने के लिए कोशिश की। हालांकि, मैं सोच रहा था कि क्या कोई आसान तरीका नहीं है। मैं समझाता हूँ कि मैं इस दृष्टिकोण का उपयोग क्यों नहीं करना चाहता:
मेरे पास एक कस्टम बटन है जो बटन का विस्तार करता है। यदि बैकग्राउंड को डिफॉल्ट बैकग्राउंड ( setBackgroundResource(int id)
या तो कॉल करके setBackgroundDrawable(Drawable d)
) से कुछ और सेट किया जाता है , तो मैं चाहता हूं कि मार्जिन 0. हो। अगर मैं कॉल करता हूं:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
मैं चाहता हूं कि मार्जिन -3 डीपी पर रीसेट हो जाए (मैं पहले ही यहां पढ़ चुका हूं कि पिक्सल से डीपी में कैसे कन्वर्ट किया जा सकता है, इसलिए एक बार जब मुझे पता है कि पीएक्स में मार्जिन कैसे सेट करना है, तो मैं स्वयं रूपांतरण का प्रबंधन कर सकता हूं)। लेकिन चूंकि इसे CustomButton
कक्षा में कहा जाता है , इसलिए माता-पिता लिनियरलैट से लेकर टेबललैटआउट तक अलग-अलग हो सकते हैं, और मैं नहीं चाहता कि वह अपने माता-पिता से मिलें और उस माता-पिता का उदाहरण देखें। मुझे लगता है कि यह भी काफी बेहतर होगा।
इसके अलावा, जब कॉलिंग (LayoutParams का उपयोग करके) parentLayout.addView(myCustomButton, newParams)
, मुझे नहीं पता कि क्या यह इसे सही स्थिति में जोड़ता है (हालांकि कोशिश नहीं की गई है), पांच की पंक्ति के मध्य बटन को कहें।
प्रश्न: क्या लेआउटपार्म्स का उपयोग करने के अलावा प्रोग्राम बटन के मार्जिन को सेट करने का कोई आसान तरीका है ?
संपादित करें: मुझे लेआउटपार्म्स के तरीके के बारे में पता है, लेकिन मैं एक समाधान चाहूंगा जो प्रत्येक अलग कंटेनर प्रकार से निपटने से बचता है:
ViewGroup.LayoutParams p = this.getLayoutParams();
if (p instanceof LinearLayout.LayoutParams) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof TableRow.LayoutParams) {
TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
}
क्योंकि this.getLayoutParams();
रिटर्न एक ViewGroup.LayoutParams
है, जो गुण नहीं है topMargin
, bottomMargin
, leftMargin
, rightMargin
। आपके द्वारा देखा जाने वाला mc उदाहरण केवल एक MarginContainer
ऑफसेट (-3dp) मार्जिन और (oml, omr, omt, omb) और मूल मार्जिन (ml, mr, mt, mb) है।