W ten , ten i ten wątek starałem się znaleźć odpowiedź, w jaki sposób ustawić marginesy na jednym widoku. Zastanawiałem się jednak, czy nie ma prostszego sposobu. Wyjaśnię, dlaczego wolałbym nie stosować tego podejścia:
Mam niestandardowy przycisk, który rozszerza przycisk. Jeśli tło jest ustawione na coś innego niż tło domyślne (przez wywołanie albo setBackgroundResource(int id)
lub setBackgroundDrawable(Drawable d)
), chcę, aby marginesy były równe 0. Jeśli wywołam to:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Chcę, aby marginesy zostały zresetowane do -3dp (już czytałem tutaj, jak przekonwertować z pikseli na dp, więc kiedy już wiem, jak ustawić marginesy w px, sam mogę zarządzać konwersją). Ale ponieważ jest to wywoływane w CustomButton
klasie, rodzic może różnić się od LinearLayout do TableLayout i wolałbym, aby nie pobierał jego rodzica i nie sprawdzał instancji tego rodzica. Wyobrażam sobie, że to również będzie nieskuteczne.
Ponadto, podczas wywoływania (przy użyciu LayoutParams) parentLayout.addView(myCustomButton, newParams)
, nie wiem, czy to dodaje go do prawidłowej pozycji (nie próbowałem jednak), powiedz środkowy przycisk z rzędu pięciu.
Pytanie: Czy jest jakiś łatwiejszy sposób programowego ustawienia marginesu jednego przycisku niż użycie LayoutParams?
EDYCJA: Znam sposób LayoutParams, ale chciałbym rozwiązania, które pozwoli uniknąć 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);
}
}
Dlatego this.getLayoutParams();
zwraca ViewGroup.LayoutParams
, które nie posiadają atrybuty topMargin
, bottomMargin
, leftMargin
, rightMargin
. Instancja MC, którą widzisz, to po prostu MarginContainer
margines przesunięcia (-3dp) i (oml, omr, omt, omb) oraz oryginalne marginesy (ml, mr, mt, mb).