Czy ten atrybut można zmieniać dynamicznie w kodzie Java?
android:layout_marginRight
Mam element TextView
, który musi dynamicznie zmieniać swoje położenie o kilka pikseli w lewo.
Jak to zrobić programowo?
EDYCJA: Bardziej ogólny sposób, który nie zależy od typu układu (poza tym, że jest to typ układu, który obsługuje marginesy):
public static void setMargins (View v, int l, int t, int r, int b) {
if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
p.setMargins(l, t, r, b);
v.requestLayout();
}
}
Powinieneś sprawdzić dokumenty pod kątem TextView . Zasadniczo będziesz chciał pobrać obiekt LayoutParams TextView i zmodyfikować marginesy, a następnie ustawić go z powrotem na TextView. Zakładając, że jest w LinearLayout, spróbuj czegoś takiego:
TextView tv = (TextView)findViewById(R.id.my_text_view);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams();
params.setMargins(0, 0, 10, 0); //substitute parameters for left, top, right, bottom
tv.setLayoutParams(params);
Nie mogę tego teraz przetestować, więc rzutowanie może być trochę wyłączone, ale LayoutParams są tym, co należy zmodyfikować, aby zmienić margines.
Nie zapominaj, że jeśli twój TextView znajduje się wewnątrz, na przykład RelativeLayout , należy użyć RelativeLayout.LayoutParams zamiast LinearLayout.LayoutParams
Użyj LayoutParams (jak już wyjaśniono). Uważaj jednak, które LayoutParams wybrać. Według https://stackoverflow.com/a/11971553/3184778 „musisz użyć widoku, który odnosi się do RODZICY widoku, nad którym pracujesz, a nie do rzeczywistego widoku”
Jeśli na przykład TextView znajduje się wewnątrz TableRow, musisz użyć TableRow.LayoutParams zamiast RelativeLayout lub LinearLayout
źródło
Użyj tej funkcji, aby ustawić wszystkie typy marginesów
źródło
Aktualizacja: Android KTX
Moduł Core KTX zawiera rozszerzenia dla popularnych bibliotek, które są częścią struktury systemu Android,
androidx.core.view
między innymi.Do obsługi marginesów przydatne są następujące funkcje rozszerzające:
setMargins()
funkcja rozszerzenia:Ustawia marginesy wszystkich osi w
ViewGroup
plikachMarginLayoutParams
. (Wymiar należy podać w pikselach, patrz ostatnia sekcja, jeśli chcesz pracować z dp)updateMargins()
funkcja rozszerzenia:Aktualizuje marginesy w
ViewGroup
plikuViewGroup.MarginLayoutParams
.updateMarginsRelative()
funkcja rozszerzenia:Aktualizacje względne marginesy w
ViewGroup
„sMarginLayoutParams
(start / koniec zamiast w lewo / prawo).Poniższe właściwości rozszerzenia są przydatne, aby uzyskać aktualne marginesy:
dp
zamiastpx
:Jeśli chcesz pracować z
dp
(pikselami niezależnymi od gęstości) zamiast zpx
, musisz najpierw je przekonwertować. Możesz to łatwo zrobić za pomocą następującej właściwości rozszerzenia:Następnie możesz wywołać poprzednie funkcje rozszerzeń, takie jak:
Stara odpowiedź:
W Kotlinie możesz zadeklarować funkcję rozszerzającą taką jak:
Następnie możesz to nazwać tak:
Lub:
źródło