Граница FrameLayout не работает
Моя структура компоновки похожа на это
LinearLayout
FrameLayout
ImageView
ImageView
FrameLayout
TextView
LinearLayout
Я установил margin для двух 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>
Ответы
Ответ 1
У меня была такая же проблема, и я заметил, что установка полей layout_
не работает, пока вы не установите гравитационный масштаб ImageView, т.е. android:layout_gravity="top"
в файле ресурсов XML, или из кода: FrameLayout.LayoutParams.gravity = Gravity.TOP;
.
Ответ 2
Чтобы было более понятно, почему. Вызов FrameLayout.onLayout() содержит это (по крайней мере, в api v.2.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);
Итак, если гравитация не установлена, расчет маржи не будет.
Ответ 3
добавьте свой xml этот атрибут и запустите
Android: layout_gravity = "верх"
все ОК!
и вы не задаете новые параметры макета, такие как:
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);
Ответ 4
Взято из документов FrameLayout (ссылка)
Размер макета кадра - это размер его самого большого дочернего элемента (плюс заполнение), видимый или нет (если разрешен родитель FrameLayout).
Это, похоже, описывает тот факт, что он удалит поля. Как упоминалось выше, вы можете попробовать переключиться на отступы, поскольку его можно использовать для создания аналогичного эффекта, если все сделано правильно.
Из любопытства вы упомянули, что он отлично работает при использовании контейнера LinearLayout
, почему выбор FrameLayout?
Ответ 5
Вы пробовали Android: layout_gravity? Попробуйте использовать android: padding в вас ImageViews вместо android: layout_margin. Поля рамки AFAIK не работают должным образом. Я даже должен был написать индивидуальный макет для этой цели один раз. Кстати, как вы хотите присвоить вам ImageViews?
Ответ 6
попробуйте setCropToPadding (true) для ImageView, это должно помочь!
Ответ 7
вам нужно установить масштаб изображения ImageView top i.e android: layout_gravity = "top" в файле ресурсов XML или из кода: FrameLayout.LayoutParams.gravity = Gravity.TOP