W systemie Android jak programowo ustawić marginesy w dp?

Wto, to ito wątek Próbowałem znaleźć odpowiedź na pytanie, jak ustawić marginesy w jednym widoku. Zastanawiałem się jednak, czy nie ma prostszego sposobu. Wyjaśnię, dlaczego raczej nie chciałbym korzystać z tego podejścia:

Mam niestandardowy przycisk, który rozszerza przycisk. Jeśli tło jest ustawione na coś innego niż domyślne tło (przez wywołanie albosetBackgroundResource(int id) lubsetBackgroundDrawable(Drawable d)), Chcę, aby marginesy były równe 0. Jeśli to nazywam:

public void setBackgroundToDefault() {
    backgroundIsDefault = true;
    super.setBackgroundResource(android.R.drawable.btn_default);
    // Set margins somehow
}

Chcę, aby marginesy zostały zresetowane do -3dp (już przeczytałemtutaj jak przekonwertować z pikseli na dp, więc gdy już wiem, jak ustawić marginesy w px, mogę sam zarządzać konwersją). Ale ponieważ nazywa się to wCustomButton klasa, rodzic może się różnić od LinearLayout do TableLayout, a ja wolałbym, żeby nie dostał swojego rodzica i nie sprawdził instancji tego rodzica. Wyobrażam sobie, że to również będzie mało skuteczne.

Również podczas dzwonienia (za pomocą LayoutParams)parentLayout.addView(myCustomButton, newParams), Nie wiem, czy to doda to do właściwej pozycji (nie próbowałem), powiedz środkowy przycisk rzędu pięciu.

Pytanie: Czy istnieje łatwiejszy sposób programowego ustawienia marginesu pojedynczego przyciskuoprócz używania LayoutParams?

EDYCJA: Wiem o sposobie LayoutParams, ale chciałbym rozwiązanie, które unika obsługi każdego innego typu kontenera:

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);
    }
}

Bothis.getLayoutParams();zwraca aViewGroup.LayoutParams, które nie mają atrybutówtopMargin, bottomMargin, leftMargin, rightMargin. Instancja mc, którą widzisz, jest po prostuMarginContainer który zawiera marginesy (-3dp) i (oml, omr, omt, omb) oraz oryginalne marginesy (ml, mr, mt, mb).

questionAnswers(12)

yourAnswerToTheQuestion