FrameLayout margin nie działa
Moja struktura layoutu jest taka
LinearLayout
FrameLayout
ImageView
ImageView
FrameLayout
TextView
LinearLayout
Ustawiłem margines dla dwóch ImageView, które są wewnątrz FrameLayout. Ale marginesy FrameLayout są odrzucane i zawsze ustawia obraz w lewym górnym rogu. Jeśli zmienię FrameLayout na LinearLayout, margines będzie działał prawidłowo. Jak sobie z tym poradzić ?
<?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 answers
Sam miałem ten sam problem i zauważyłem, że ustawianie marginesów layout_
nie działa, dopóki nie ustawisz grawitacji układu ImageView tj. android:layout_gravity="top"
w pliku zasobów XML, lub z kodu: FrameLayout.LayoutParams.gravity = Gravity.TOP;
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-23 18:42:24
Żeby było jasne dlaczego. FrameLayout.wywołanie onLayout () Zawiera to (przynajmniej w 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
Więc jeśli grawitacja wynosi -1, nie będzie obliczania marginesu. Chodzi o to, że grawitacja w FrameLayout.LayoutParams jest zdefiniowany przez:
gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);
Więc jeśli grawitacja nie jest ustawiona, nie będzie obliczania marginesu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-23 15:06:19
Dodaj swój XML ten atrybut i uruchom ponownie
Android:layout_gravity="top"
Wszystko w porządku!I nie ustawiasz tak nowych layoutów;
FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(WallpapersActivity.ScreenWidth/2, layH);
Użyj TAK:
FrameLayout.LayoutParams llp = (LayoutParams) myFrameLay.getLayoutParams();
llp.height = 100;
llp.width = 100;
myFrameLay.setLayoutParams(llp);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-01 19:03:18
Wzięte z FrameLayout docs ( link )
Rozmiar układu ramki jest wielkością jego największego potomka (plus wypełnienie), widocznego lub nie (jeśli rodzic FrameLayout na to pozwala).
To wydaje się opisywać fakt, że usunie marginesy. Jak wspomniał boulder, możesz spróbować przełączyć się na padding, ponieważ może być użyty do uzyskania podobnego efektu, jeśli zostanie prawidłowo wykonany.
Z ciekawości wspomniałeś, że działa dobrze, gdy używasz LinearLayout
kontener, dlaczego wybór FrameLayout?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-13 23:53:14
Próbowałeś android: layout_gravity ? Spróbuj użyć android: padding w ImageViews zamiast android: layout_margin. Marginesy AFAIK nie działają poprawnie na układzie Ramki. Musiałem nawet napisać niestandardowy układ w tym celu. BTW, jak chcesz wyrównać obraz?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-25 13:22:00
Spróbuj setCropToPadding (true) do ImageView ,to powinno być pomocne!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 14:58:16
Musisz ustawić układ ImageView Gravity top tj. android: layout_gravity="top" w pliku zasobów XML lub z kodu: FrameLayout.LayoutParams.grawitacja = grawitacja.TOP
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-20 07:49:00