android : layout_weight은 무슨 뜻인가요?


답변:


860

를 사용 layout_weight하면 여러보기 사이의 크기 비율을 지정할 수 있습니다. 예를 들어 MapView및에 table지도에 대한 추가 정보를 표시해야하는가 있습니다. 지도는 화면의 3/4을 사용해야하고 테이블은 화면의 1/4을 사용해야합니다. 그럼 당신은 설정됩니다 layout_weightmap3과 layout_weight의를 table1로.

작동 시키려면 방향에 따라 높이 또는 너비를 0px로 설정해야합니다.


208
당신이 0px 높이를 언급 할 때까지 머리 스크래퍼!
JohnnyLambada

24
무게에 영향을받는 것을 정의합니다. 너비 또는 높이
neteinstein

30
0px가 필요합니다. 예 : 동일한 크기의 두 열이있는 테이블을 구현하려고합니다. 각 테이블 행은 두 개의 "테이블 셀"(예 : TextViews)이있는 가로 선형 레이아웃이며 각각은 layout_weight = .5입니다. "테이블 셀"에 layout_width = "wrap_content"를 지정하면 content_width가 layout_weight로 계산 된 너비에 추가되고 테이블 셀의 크기가 모두 달라지며 열이 올바르게 정렬되지 않습니다. 따라서 android_layout_weight 만 사용하여 셀 너비를 계산하도록 layout_width = 0dp를 설정해야합니다.
eeeeaaii

3
@Solace, 늦게 대답했지만 완전성을 위해 .. weight 속성이 RelativeLayout에 기여하지 않는 것 같습니다. LinearLayout에서만 작동합니다. weigth가 필요한 경우 RelativeLayout 내에 LinearLayout (가중치 포함)을 작성하는 것이 좋습니다.
bbv

1
layout_weight는 선형 레이아웃에서만 작동하거나 모든보기 그룹에서 작동합니다.
meShakti

247

간단히 말해서, layout_weight레이아웃에 추가 공간이 뷰에 할당되는 정도를 지정합니다.

LinearLayout은 개별 어린이에게 가중치를 할당하는 것을 지원합니다. 이 속성은 "중요도"값을 뷰에 할당하고 확장하여 상위 뷰의 나머지 공간을 채울 수 있도록합니다. 뷰의 기본 가중치는 0입니다.

자식 사이에 남은 공간을 할당하기위한 계산

일반적으로 공식은 다음과 같습니다.

자녀에게 할당 된 공간 = (자녀의 개별 무게) / (선형 레이아웃에서 모든 자녀의 무게 합계)

실시 예 1

세 개의 텍스트 상자가 있고 그 중 두 개가 가중치 1을 선언하고 세 번째 텍스트 상자에 가중치 (0)가없는 경우 나머지 공간은 다음과 같이 지정됩니다.

첫 번째 텍스트 상자 = 1 / (1 + 1 + 0)

두 번째 텍스트 상자 = 1 / (1 + 1 + 0)

세 번째 텍스트 상자 = 0 / (1 + 1 + 0)

실시 예 2

가로 행에 텍스트 레이블과 두 개의 텍스트 편집 요소가 있다고 가정합니다. 레이블이 layout_weight지정 되지 않았 으므로 렌더링에 필요한 최소 공간을 차지합니다. 경우 layout_weight두 개의 텍스트 편집 요소의 각각을 1로 설정 (우리는 그들이 똑같이 중요 주장 때문에), 부모 레이아웃의 나머지 폭은 동일하게 그들 사이에 분할됩니다.

계산:

첫 번째 라벨 = 0 / (0 + 1 + 1)

두 번째 텍스트 상자 = 1 / (0 + 1 + 1)

세 번째 텍스트 상자 = 1 / (0 + 1 + 1)

대신 첫 번째 텍스트 상자에 a layout_weight가 1이고 두 번째 텍스트 상자 layout_weight에 2가 있으면 나머지 공간의 3 분의 1은 첫 번째에, 2/3는 두 번째에 주어집니다 (두 번째는 두 번째로 주장하기 때문에) 하나는 더 중요하다).

계산:

첫 번째 라벨 = 0 / (0 + 1 + 2)

두 번째 텍스트 상자 = 1 / (0 + 1 + 2)

세 번째 텍스트 상자 = 2 / (0 + 1 + 2)


소스 기사


19
현재 선택된 답변보다 훨씬 더 나은 설명.
Shade

12
글쎄, 간단한 설명 (내가 높이 평가하는 것)과 중요한 세부 사항 (나는 다른 방식으로 높이 평가한다)이있다. 둘 다 좋은 대답입니다.
cbmanica

3
다른 곳에서 언급했듯이 android:layout_width="0px"중요합니다. 또한 가중치는 정수일 필요는 없습니다.
브라이언 화이트

선택한 답변보다 이해하기가 다소 어렵지만 특히 일부 견해에 가중치가 있고 그렇지 않은 경우 완전한 답변을 제공합니다. 선택한 답변에서 다루지 않은 거대한 유스 케이스입니다.
Acey

weightSum그러면 어디서 사진을 볼 수 있습니까? 그것과 관련이 layout_weight있습니까?
eRaisedToX

72

다른 답변에 추가하면이 작업을 수행하는 가장 중요한 것은 레이아웃 너비 (또는 높이)를 0px로 설정하는 것입니다

android:layout_width="0px"

그렇지 않으면 당신은 쓰레기를 볼 것이다


가중치를 정의하지 않는 뷰를 숨기거나 크기에 맞는 크기로 표시하고 남은 여유 공간을 "가중치"뷰로 남겨 두려는 경우에 따라 다릅니다.
Andrea Leganza

수평 및 수직 무게를 모두 설정해야하는 경우 어떻게합니까?
Alston

40

에 걸쳐 여러 뷰가있는 경우 각각에 비례 크기 LinearLayoutlayout_weight제공합니다. 더 큰 layout_weight값을 가진보기는 더 "무게"측정되므로 더 큰 공간을 얻습니다.

다음은 더 명확하게 만드는 이미지입니다.

여기에 이미지 설명을 입력하십시오

이론

레이아웃 가중치라는 용어 는 수학에서 가중 평균 의 개념과 관련이 있습니다. 숙제는 30 %, 출석은 10 %, 중간은 20 %, 마지막은 40 % 인 대학 수업과 같습니다. 해당 부품에 대한 점수는 함께 가중치를 부여 할 때 총점을줍니다.

여기에 이미지 설명을 입력하십시오

레이아웃 가중치와 동일합니다. Views수평 인은 LinearLayout각각 전체 폭의 일정 비율을 걸릴 수 있습니다. (또는 세로 높이의 백분율입니다 LinearLayout.)

배치

LinearLayout같은 당신 사용이 보일 것입니다 뭔가 :

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <!-- list of subviews -->

</LinearLayout>

에 사용해야 layout_width="match_parent"합니다 LinearLayout. 을 사용하면 wrap_content작동하지 않습니다. 또한 layout_weightRelativeLayouts의 뷰에서는 작동하지 않습니다 ( 이 문제를 다루는 SO 답변 은 여기여기 참조 ).

관점들

가로의 각보기 LinearLayout는 다음과 같습니다.

<Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

layout_width="0dp"와 함께 사용해야 합니다 layout_weight="1". 이것을 잊어 버리면 많은 새로운 사용자 문제가 발생합니다. (참조 이 문서 귀하의 의견이있는 경우 그렇지 0으로 폭을 설정하여 얻을 수있는 다른 결과를) 수직 LinearLayout 다음 사용하는 것이 layout_height="0dp"물론을.

위의 Button예에서 가중치를 1로 설정했지만 아무 숫자 나 사용할 수 있습니다. 중요한 것은 합계입니다. 내가 게시 한 첫 번째 이미지의 세 줄의 단추에서 볼 수 있지만 숫자는 모두 다르지만 비율이 같으므로 가중치가 적용된 너비는 각 행에서 변경되지 않습니다. 어떤 사람들은 복잡한 레이아웃에서 각 부분의 무게가 무엇인지 명확하게하기 위해 합계가 1 인 10 진수를 사용하려고합니다.

마지막 메모. 를 사용하는 중첩 레이아웃이 많이 있으면 layout_weight성능이 떨어질 수 있습니다.

특별한

상단 이미지의 xml 레이아웃은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="2" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:text="20" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".50"
            android:text=".50" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

    </LinearLayout>

</LinearLayout>

1
나는 왜 더 많은 사람들이 왜 XML과 함께 이미지를 게시하지 않는지 궁금합니다. 코드보다 비주얼을 이해하는 것이 훨씬 쉽습니다.
AleksandrH

30

layout_weight안드로이드는 배포하는 방법에 대해 설명 ViewA의들 LinearLayout. 그런 다음 Android는 먼저 View가중치가 지정된 모든에 필요한 총 비율을 계산하고 필요한 View화면 비율에 따라 각각을 배치 합니다. 다음 예에서, 안드로이드는 것을보고 TextView들은이 layout_weight의를 0(기본값)와 EditTexts는이 layout_weight2(가) 동안, 각각 Button의 무게가 1. 그래서 안드로이드 할당 '충분한'디스플레이 공간 tvUsernametvPassword다음과에 할당이있는 5 등분으로 화면 너비의 나머지 분할 etUsername, 두 etPassword과의 마지막 부분 bLogin:

<LinearLayout android:orientation="horizontal" ...>

    <TextView android:id="@+id/tvUsername" 
    android:text="Username" 
    android:layout_width="wrap_content" ... />

    <EditText android:id="@+id/etUsername"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <TextView android:id="@+id/tvPassword"
    android:text="Password"
    android:layout_width="wrap_content" />

    <EditText android:id="@+id/etPassword"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <Button android:id="@+id/bLogin"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="Login"... />

</LinearLayout>

그것은 다음과 같습니다
가로 방향
세로 방향


더 이상 링크를 사용할 수 없습니다. 다른 좋은 참조가 있으면 업데이트하십시오.
BinaryGuy

16

그렇게 생각하면 더 간단해질 것입니다

3 개의 버튼이 있고 그 무게가 1,3,1 인 경우 HTML의 표처럼 작동합니다

해당 라인에 5 개 부분을 제공하십시오. 단추 1에 1 개, 단추 2에 3 개, 단추 1에 1 개를 제공하십시오.

관련,


10

나에게 가장 좋은 설명 중 하나이것입니다 (Android 튜토리얼에서 7 단계를 찾으십시오) .

layout_weight는 LinearLayouts에서 레이아웃 내 뷰에 "중요도"를 할당하는 데 사용됩니다. 모든 뷰의 기본 레이아웃 가중치는 0입니다. 즉, 화면에서 표시해야 할만큼의 공간 만 차지합니다. 0보다 큰 값을 할당하면 각 뷰의 layout_weight 값과이 뷰 및 다른 뷰 요소의 현재 레이아웃에 지정된 전체 layout_weight에 대한 비율에 따라 상위 뷰에서 사용 가능한 나머지 공간이 분할됩니다.

예를 들어 : 가로 행에 텍스트 레이블과 두 개의 텍스트 편집 요소가 있다고 가정 해 봅시다. 레이블에 layout_weight가 지정되어 있지 않으므로 렌더링에 필요한 최소 공간을 차지합니다. 두 개의 텍스트 편집 요소 각각의 layout_weight가 1로 설정되면 부모 레이아웃의 나머지 너비가 똑같이 중요합니다. 첫 번째 레이아웃의 레이아웃 가중치가 1이고 두 번째 레이아웃의 가중치가 2 인 경우 나머지 공간의 1/3이 첫 번째 공간에, 2/3가 두 번째 공간에 주어집니다 (두 번째 것이 더 중요하다고 주장하기 때문에).



4

추가

대한 vertical방향 설정 잊지 마세요 height0dp로를

android:layout_height="0dp"

대한 horizontal방향 설정 잊지 마세요 width0dp로를

android:layout_width="0dp"

3

LinearLayout의 weightSum과 각 View의 layout_weight를 확인하십시오. android : weightSum = "4"android : layout_weight = "2"android : layout_weight = "2"layout_height는 모두 0px이지만 관련성이 확실하지 않습니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4">

<fragment android:name="com.example.SettingFragment"
    android:id="@+id/settingFragment"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    />

<Button
    android:id="@+id/dummy_button"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    android:text="DUMMY"
    />
</LinearLayout>

LinearLayout의 weightSum과 각 View의 layout_weight를 확인하십시오. android : weightSum = "4"android : layout_weight = "2"android : layout_weight = "2"layout_height는 모두 0px이지만 관련성이 확실하지 않습니다.
Ming Leung

0

에서 두 답변을 결합

Flo & rptwsthi와 roetzi,

를 변경해야합니다 layout_width=0dp/px. 그렇지 않으면 layout_weight동작이 가장 작은 공간을 차지한 가장 큰 숫자와 가장 큰 공간을 차지하는 가장 낮은 숫자로 거꾸로 작동합니다.

또한 일부 가중치 조합은 공간을 차지하기 때문에 일부 레이아웃을 표시 할 수 없습니다.

이것을 조심하십시오.


0

추가 android:autoSizeTextType="uniform"하면 자동으로 텍스트 크기가 조정됩니다


-1

이름에서 알 수 있듯이 레이아웃 가중치는 특정 필드 또는 위젯이 화면 공간을 차지해야하는 공간의 양 또는 백분율을 지정합니다.
가중치를 가로 방향으로 지정하면을 지정해야합니다 layout_width = 0px.
마찬가지로, 세로 방향으로 가중치를 지정하면을 지정해야합니다 layout_height = 0px.

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