ในนี้ , นี้และนี้ด้ายฉันพยายามที่จะหาคำตอบเกี่ยวกับวิธีการตั้งค่าระยะขอบบนมุมมองเดียว อย่างไรก็ตามฉันสงสัยว่าถ้าไม่มีวิธีที่ง่ายกว่านี้ ฉันจะอธิบายว่าทำไมฉันจึงไม่ต้องการใช้วิธีนี้:
ฉันมีปุ่มที่กำหนดเองซึ่งขยายปุ่ม หากพื้นหลังถูกตั้งค่าเป็นอย่างอื่นนอกเหนือจากพื้นหลังเริ่มต้น (โดยการเรียกอย่างใดอย่างหนึ่งsetBackgroundResource(int id)
หรือsetBackgroundDrawable(Drawable d)
) ฉันต้องการให้ระยะขอบเป็น 0 ถ้าฉันเรียกสิ่งนี้ว่า
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
ฉันต้องการให้อัตรากำไรขั้นต้นที่จะรีเซ็ต -3dp (ฉันได้อ่านที่นี่วิธีการแปลงจากพิกเซล DP, ดังนั้นเมื่อผมรู้ว่าอัตรากำไรที่ตั้งอยู่ใน px ผมสามารถจัดการแปลงตัวเอง) แต่เนื่องจากสิ่งนี้ถูกเรียกในCustomButton
ชั้นเรียนผู้ปกครองอาจแตกต่างจาก LinearLayout ถึง TableLayout และฉันไม่อยากให้เขาได้รับผู้ปกครองของเขาและตรวจสอบตัวอย่างของผู้ปกครองนั้น นั่นจะเป็นสิ่งที่ไม่มีประสิทธิภาพเลยทีเดียว
นอกจากนี้เมื่อโทร (โดยใช้ LayoutParams) parentLayout.addView(myCustomButton, newParams)
ฉันไม่รู้ว่าสิ่งนี้เพิ่มเข้าไปในตำแหน่งที่ถูกต้อง (ยังไม่ได้ลอง) ให้พูดปุ่มกลางของแถวที่ห้า
คำถาม: มีวิธีใดที่ง่ายกว่าในการตั้งค่าระยะขอบของปุ่มเดียวโดยทางโปรแกรมนอกเหนือจากการใช้ LayoutParams?
แก้ไข: ฉันรู้วิธี LayoutParams แต่ฉันต้องการโซลูชันที่หลีกเลี่ยงการจัดการแต่ละประเภทภาชนะที่แตกต่างกัน:
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)