FrameLayout 여백이 작동하지 않습니다.


79

내 레이아웃 구조는 다음과 같습니다.

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

FrameLayout 안에있는 두 개의 ImageView에 대한 여백을 설정했습니다. 그러나 FrameLayout 여백은 무시되고 항상 Image가 왼쪽 상단 모서리로 설정됩니다. 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>

답변:


221

나도 같은 문제가 있었고 layout_ImageView의 레이아웃 중력, 즉 android:layout_gravity="top"XML 리소스 파일이나 코드에서 설정할 때까지 여백 설정이 작동하지 않는다는 것을 알았습니다 FrameLayout.LayoutParams.gravity = Gravity.TOP;.


21
작동하지만 더럽게 느껴집니다. 나는 내가 CSS 해킹의 시대를 탈출했다고 생각했다 ...
erlando

1
FrameLayout.LayoutParams.gravity는 2.3에서 중력 옵션이 없습니다
JPM

2
4.1 (아마 이전)에서 수정 된 것 같습니다. 하지만 알고 유용한
pablisco

내가 오래된 타오르는 불에 있던 문제를 수정했습니다. 감사!
DallinDyer 2013 년

12
이유를 더 명확히하기 위해서. FrameLayout.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); 중력이 설정되지 않은 경우 여백 계산이 없습니다.
Miklos Jakab 2013 년

8

이유를 더 명확히하기 위해. FrameLayout.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);

따라서 중력이 설정되지 않으면 여백 계산이 없습니다.


7

이 속성을 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);

1
따라서 LayoutParams가 없으면 두 번째 방법으로 충돌이 발생합니다.
Léon Pelletier 2014

if == null 컨트롤로 확인할 수 있습니다.
Savas Adar

이것은 안드로이드 (10)에 margin_top 내 문제를 해결
페드로 파울로 아모 림

1

FrameLayout 문서에서 가져옴 ( link )

프레임 레이아웃의 크기는 가장 큰 자식 (패딩 포함)의 크기이며 표시 여부 (FrameLayout의 부모가 허용하는 경우)입니다.

이것은 여백을 제거한다는 사실을 설명하는 것 같습니다. 언급 한 boulder와 마찬가지로 제대로 수행하면 유사한 효과를내는 데 사용할 수 있으므로 padding으로 전환 해 볼 수 있습니다.

호기심에서 LinearLayout컨테이너를 사용할 때 잘 작동한다고 언급했는데 왜 FrameLayout을 선택해야합니까?


0

android : layout_gravity를 사용해 보셨습니까? android : layout_margin 대신 ImageViews에서 android : padding을 사용해보십시오. AFAIK 여백이 프레임 레이아웃에서 제대로 작동하지 않습니다. 그 목적을 위해 사용자 지정 레이아웃을 한 번 작성해야했습니다. BTW, ImageView를 어떻게 할당 하시겠습니까?


프레임 레이아웃에 가중치가 없습니다
njzk2 2011

0

ImageView에 setCropToPadding (true)을 시도해보십시오.


0

XML 리소스 파일 또는 코드에서 ImageView의 레이아웃 중력 상단 즉 android : layout_gravity = "top"을 설정해야합니다. FrameLayout.LayoutParams.gravity = Gravity.TOP

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.