Trong này , này và này chủ đề tôi đã cố gắng để tìm một câu trả lời về cách thiết lập lề trên một cái nhìn duy nhất. Tuy nhiên, tôi đã tự hỏi nếu không có cách nào dễ dàng hơn. Tôi sẽ giải thích lý do tại sao tôi không muốn sử dụng phương pháp này:
Tôi có một nút tùy chỉnh mở rộng nút. Nếu nền được đặt thành một cái gì đó khác với nền mặc định (bằng cách gọi một trong hai setBackgroundResource(int id)
hoặc setBackgroundDrawable(Drawable d)
), tôi muốn lề là 0. Nếu tôi gọi đây là:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Tôi muốn lề được đặt lại thành -3dp (Tôi đã đọc ở đây cách chuyển đổi từ pixel sang dp, vì vậy một khi tôi biết cách đặt lề trong px, tôi có thể tự mình quản lý chuyển đổi). Nhưng vì cái này được gọi trong CustomButton
lớp, nên cha mẹ có thể thay đổi từ linearLayout sang TableLayout, và tôi không muốn anh ta lấy cha mẹ của mình và kiểm tra ví dụ của cha mẹ đó. Điều đó cũng sẽ khá kém hiệu quả, tôi tưởng tượng.
Ngoài ra, khi gọi (sử dụng LayoutParams) parentLayout.addView(myCustomButton, newParams)
, tôi không biết liệu điều này có thêm nó vào đúng vị trí không (tuy nhiên chưa thử), hãy nói nút giữa của một hàng năm.
Câu hỏi: Có cách nào dễ dàng hơn để đặt lề của một Nút duy nhất theo chương trình bên cạnh việc sử dụng LayoutParams không?
EDIT: Tôi biết về cách LayoutParams, nhưng tôi muốn một giải pháp tránh xử lý từng loại container khác nhau:
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);
}
}
Bởi vì this.getLayoutParams();
lợi nhuận một ViewGroup.LayoutParams
, mà không có các thuộc tính topMargin
, bottomMargin
, leftMargin
, rightMargin
. Ví dụ mc bạn thấy chỉ là một MarginContainer
tệp chứa lề (-3dp) và (oml, omr, omt, omb) và lề gốc (ml, mr, mt, mb).