У цій , цій і цій темі я спробував знайти відповідь про те, як встановити поля для одного виду. Однак мені було цікаво, чи немає більш простого способу. Я поясню, чому я не хотів би використовувати такий підхід:
У мене є спеціальна кнопка, яка розширює кнопку. Якщо для фону встановлено щось інше, ніж фон за замовчуванням (за допомогою дзвінка 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?
EDIT: Я знаю спосіб 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, який ви бачите, є лише a, MarginContainer
який містить зміщення (-3dp) поля та (oml, omr, omt, omb) та початкові поля (ml, mr, mt, mb).