FrameLayout margin not working

AndroidAndroid Layout

Android Problem Overview


My layout structure is like this

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

I have set margin's for the two ImageView which are inside FrameLayout. But FrameLayout margins are discarded and it always set's the Image to top left corner. If i change from FrameLayout to LinearLayout the margin's work properly. How to handle this ?

<?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>

Android Solutions


Solution 1 - Android

I had the same issue myself and noticed that setting the layout_ margins does not work until you also set your ImageView's layout gravity i.e. android:layout_gravity="top" in the XML resource file, or from code: FrameLayout.LayoutParams.gravity = Gravity.TOP;.

Solution 2 - Android

To make it more clear why. The FrameLayout.onLayout() call contains this (in api v2.3.4 at least):

    // for each child
    final LayoutParams lp = (LayoutParams) child.getLayoutParams();
    final int gravity = lp.gravity;
    if (gravity != -1) {
        // handle all margin related stuff

So if gravity is -1, there will be no margin calculation. And the thing is, gravity in FrameLayout.LayoutParams is defined by:

    gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);

So if gravity is not set, there will be no margin calculation.

Solution 3 - Android

add your xml this attribute and re run

android:layout_gravity="top"

everything is Ok!

and you dont set new layout params like this;

FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(WallpapersActivity.ScreenWidth/2, layH);

use like this:

FrameLayout.LayoutParams llp = (LayoutParams) myFrameLay.getLayoutParams();
llp.height = 100;
llp.width = 100;
myFrameLay.setLayoutParams(llp);
		

Solution 4 - Android

Taken from the FrameLayout docs ([link][1])

> The size of the frame layout is the size of its largest child (plus padding), visible or not (if the FrameLayout's parent permits).

This seems to describe the fact that it'll strip margins out. Like boulder mentioned, you could try switching to padding as it can be used to produce a similar effect if done properly.

Out of curiosity, you mentioned that it does work fine when using a LinearLayout container, why the choice of FrameLayout?

[1]: http://developer.android.com/reference/android/widget/FrameLayout.html "link"

Solution 5 - Android

Have you tried android:layout_gravity ? Try using android:padding in you ImageViews instead of android:layout_margin. AFAIK margins doesn't work properly on Frame layout. I even had to write custom layout for that purpose once. BTW, how do you want allign you ImageViews?

Solution 6 - Android

try setCropToPadding(true) to ImageView ,this should be helped!

Solution 7 - Android

you have to set your ImageView's layout gravity top i.e. android:layout_gravity="top" in the XML resource file, or from code: FrameLayout.LayoutParams.gravity = Gravity.TOP

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVinothView Question on Stackoverflow
Solution 1 - AndroidAndreiView Answer on Stackoverflow
Solution 2 - AndroidMiklos JakabView Answer on Stackoverflow
Solution 3 - AndroidSavas AdarView Answer on Stackoverflow
Solution 4 - AndroidJoeyView Answer on Stackoverflow
Solution 5 - AndroidDmitry RyadnenkoView Answer on Stackoverflow
Solution 6 - AndroidkidfolkView Answer on Stackoverflow
Solution 7 - AndroidKomal NikhareView Answer on Stackoverflow