FrameLayout margin не работает
моя структура макета выглядит так
LinearLayout
FrameLayout
ImageView
ImageView
FrameLayout
TextView
LinearLayout
Я установил маржу для двух ImageView, которые находятся внутри FrameLayout. Но поля FrameLayout отбрасываются, и он всегда устанавливает изображение в верхний левый угол. Если я перейду от FrameLayout к LinearLayout, маржа будет работать правильно. Как с этим справиться ?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/inner1"
>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<ImageView
android:layout_width="24px"
android:layout_height="24px"
android:id="@+id/favicon"
android:layout_marginLeft="50px"
android:layout_marginTop="50px"
android:layout_marginBottom="40px"
android:layout_marginRight="70px"
/>
<ImageView
android:layout_width="52px"
android:layout_height="52px"
android:id="@+id/applefavicon"
android:layout_marginLeft="100px"
android:layout_marginTop="100px"
android:layout_marginBottom="100px"
android:layout_marginRight="100px"
/>
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/title"
android:layout_marginLeft="10px"
android:layout_marginTop="20px"
android:textColor="#FFFFFF"
android:textSize = "15px"
android:singleLine = "true"
/>
</LinearLayout>
7 ответов:
у меня был тот же вопрос сам и заметил, что установка
layout_
поля не работают, пока вы также не установите гравитацию макета ImageView, т. е.android:layout_gravity="top"
в файле ресурсов XML или из кода:FrameLayout.LayoutParams.gravity = Gravity.TOP;
.
чтобы было более понятно почему. Так.вызов onLayout() содержит это (по крайней мере, в api v2.3.4):
// for each child final LayoutParams lp = (LayoutParams) child.getLayoutParams(); final int gravity = lp.gravity; if (gravity != -1) { // handle all margin related stuff
поэтому, если гравитация равна -1, не будет расчета маржи. И дело в том, что гравитация в FrameLayout.LayoutParams определяется следующим образом:
gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);
Так что если гравитация не установлен, не будет никакого расчета маржи.
добавьте xml этот атрибут и повторно запустите
android: layout_gravity= "top"
все ок!
и вы не установили новые параметры макета, как это:
FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(WallpapersActivity.ScreenWidth/2, layH);
использовать такой:
FrameLayout.LayoutParams llp = (LayoutParams) myFrameLay.getLayoutParams(); llp.height = 100; llp.width = 100; myFrameLay.setLayoutParams(llp);
взято из FrameLayout docs (ссылке)
размер макета фрейма-это размер его самого большого дочернего элемента (плюс заполнение), видимый или нет (если родительский элемент FrameLayout разрешает).
это, кажется, описывает тот факт, что он будет удалять поля. Как упоминалось в boulder, вы можете попробовать переключиться на прокладку, поскольку она может быть использована для получения аналогичного эффекта, если все сделано правильно.
из любопытства, вы упомянули, что он делает отлично работает при использовании
LinearLayout
контейнер, почему выбор FrameLayout?
вы пробовали android: layout_gravity ? Попробуйте использовать android: padding в Вас ImageViews вместо android: layout_margin. Поля насколько мне известно, не работает должным образом на каркас. Мне даже пришлось написать пользовательский макет для этой цели один раз. Кстати, как вы хотите allign вы ImageViews?