Uzyskaj margines widoku

95

Jak mogę uzyskać wartość marginesu widoku z działania? Widok może być dowolnego typu.

Po krótkich poszukiwaniach znalazłem sposoby na wypełnienie widoku, ale nie mogłem znaleźć niczego na Margin. Czy ktoś może pomóc?

Próbowałem czegoś takiego

ViewGroup.LayoutParams vlp = view.getLayoutParams();
int marginBottom = ((LinearLayout.LayoutParams) vlp).bottomMargin;

To działa, ale w powyższym kodzie założyłem, że jest to plik LinearLayout. Ale muszę pobrać marginatrybut, nawet jeśli nie znam typu widoku.

Arnab Chakraborty
źródło

Odpowiedzi:

180

Spróbuj tego:

View view = findViewById(...) //or however you need it
LayoutParams lp = (LayoutParams) view.getLayoutParams();

marginesy są dostępne za pośrednictwem

lp.leftMargin;
lp.rightMargin;
lp.topMargin;
lp.bottomMargin;

edycja: może ViewGroup.MarginLayoutParamszadziała dla Ciebie. To klasa bazowa dla innych LayoutParams.

ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();

http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html

Vladimir
źródło
7
Właściwie spodziewałem się czegoś takiego, ale nie sądzę, aby była wywoływana żadna bezpośrednia klasa LayoutParams. Są zajęcia, takie jak FrameLayout.LayoutParams, RelativeLayout.LayoutParams, ale nic takiego LayoutParamsw sobie. A ponieważ nie znam typu widoku, nie mogę skorzystać z żadnej z poprzednich klas.
Arnab Chakraborty
5
co ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();wtedy?
Vladimir,
Powinien być ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams ();
rockhammer
4

teraz użyj tego edytowanego kodu. to ci pomoże

FrameLayout.LayoutParams lp=(FrameLayout.LayoutParams)mainLayout.getLayoutParams();

lp.leftMargin  // for left margin
lp.rightMargin   // for right margin
ilango j
źródło
Wspomniane metody dają lewą, prawą, górną i dolną pozycję widoku, potrzebuję marginesów.
Arnab Chakraborty
Niekoniecznie. Widok może umieszczać w LinearLayoutz horizontalorientacją. Jeśli jest to drugi widok w układzie, view.getLeft()metoda podałaby mi współrzędne jego lewego, ale lewego marginesu widoku z sąsiedniego widoku.
Arnab Chakraborty
A jeśli widok jest LinearLayout?
Arnab Chakraborty
3

Jak sugerowali inni, layout_margin # to przestrzeń pomiędzy krawędzią rodzica # a Twoim widokiem.

  • # zastępuje „Lewy”, „Prawy”, „Górny” lub „Dolny”

Uzyskanie / ustawienie marginesów zadziałało dla mnie z:

ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
params.topMargin += 20;
mView.requestLayout();

Oczywiście mój widok był rzeczywiście ViewGroup, a rodzic był również ViewGroup. W większości przypadków powinieneś rzutować parametry swojego układu do klasy View elementu nadrzędnego LayoutParams (w tym przypadku jest to ViewGroup i RelativeLayout)

milosmns
źródło