Получите маржу просмотра

95

Как я могу получить значение маржи представления из действия? Вид может быть любого типа.

После небольшого поиска я нашел способы получить заполнение представления, но ничего не нашел на Margin. Кто-нибудь может помочь?

Я пробовал что-то вроде этого,

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

Это работает, но в приведенном выше коде я предположил, что представление является файлом LinearLayout. Но мне нужно получить marginатрибут, даже если я не знаю тип представления.

Арнаб Чакраборти
источник

Ответы:

180

попробуй это:

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

поля доступны через

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

edit: возможно ViewGroup.MarginLayoutParams, сработает для вас. Это базовый класс для других LayoutParams.

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

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

Владимир
источник
7
На самом деле я ожидал чего-то подобного, но я не думаю, что есть прямой вызов класса LayoutParams. Есть классы вроде FrameLayout.LayoutParams, RelativeLayout.LayoutParamsно ничего похожего LayoutParamsсамо по себе. А так как я не знаю тип представления, я не могу использовать ни один из предыдущих классов.
Арнаб Чакраборти
5
а что ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();тогда?
Владимир
Должно быть ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams ();
rockhammer
4

теперь используйте этот отредактированный код. это поможет тебе

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

lp.leftMargin  // for left margin
lp.rightMargin   // for right margin
Иланго Дж
источник
Упомянутые вами методы дают левую, правую, верхнюю и нижнюю позиции представления, мне нужны поля.
Арнаб Чакраборти
Не обязательно. Вид может быть размещен в LinearLayoutс horizontalориентацией. Если это второй вид в макете, view.getLeft()метод предоставит мне координату его левого, но левого края вида из соседнего вида.
Арнаб Чакраборти
Что делать, если View - это LinearLayout?
Арнаб Чакраборти
3

Как предлагали другие, layout_margin # - это пространство между родительским краем # и вашим видом.

  • # заменяет "Left", "Right", "Top" или "Bottom"

Получение / установка полей у меня работала с:

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

Конечно, мой View действительно был ViewGroup, и родительский элемент тоже был ViewGroup. В большинстве случаев вы должны передать свои параметры макета в родительский класс View LayoutParams (в данном случае это ViewGroup и RelativeLayout)

Милосмнс
источник