В Android, как я могу установить поля в dp программно?

Вэтот, этот а такжеэтот Я пытался найти ответ о том, как установить поля для одного представления. Однако мне было интересно, не существует ли более простого способа. Я объясню, почему я бы не хотел использовать этот подход:

У меня есть пользовательская кнопка, которая расширяет кнопку. Если фон установлен на что-то другое, чем фон по умолчанию (вызывая либо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)Я не знаю, добавляет ли это его в правильное положение (однако не пробовал), скажем, среднюю кнопку в ряду из пяти.

Вопрос: Есть ли более простой способ программно установить поле для одной кнопки?besides using 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. The mc instance you see is just a MarginContainer который содержит поля со смещением (-3dp) и (oml, omr, omt, omb) и исходные поля (ml, mr, mt, mb).

Ответы на вопрос(12)

Ваш ответ на вопрос