안드로이드에서 android : weightSum은 무엇이며 어떻게 작동합니까?


답변:


133

문서 당 android:weightSum최대 무게 합계를 정의하고 layout_weight명시 적으로 지정하지 않은 경우 모든 자식 의 합계로 계산됩니다 .

LinearLayout가로 방향이 있고 그 ImageViews안에 3이 있는 예를 생각해 봅시다 . 이제 우리는 이것들이 ImageViews항상 같은 공간을 차지하기를 원합니다 . 이것을 달성하기 위해, 당신 layout_weight은 각각 ImageView을 1로 설정할 수 weightSum있으며 주석에 표시된 것처럼 3은 3과 동일하게 계산됩니다.

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    <!-- android:weightSum="3" -->
    android:orientation="horizontal"
    android:layout_gravity="center">

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

weightSum 너비와 높이를 직접 설정하면 발생하지 않는 모든 장치에 대해 레이아웃을 올바르게 렌더링하는 데 유용합니다.


145
이것은의 목적에 대한 설명이 아닙니다 weightSum. 예제의 동작은 weightSum생략 된 것과 동일하므로 실제로 해당 시나리오에서 weightSum을 지정하지 않아야합니다. 문서는 말한다weightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.
— 제프 악셀로드

3
@JeffAxelrod : "지정하지 않아야한다"? 왜? 그럴 이유가 없습니다. 그래서 나는 그것을 지정할 필요가 없다고 말하고 싶습니다.
— caw

17
@MarcoW .: 유지 관리 성 때문에 지정해서는 안됩니다. Jeff가 말했듯이 weightSum을 레이아웃 내부의 가중치 합계와 동일하게 설정해도 아무런 효과가 없지만 나중에 누군가가 변경하면 두통이 발생할 수 있습니다. 이제 레이아웃에 불필요한 수정자가있어서 발견해야합니다. 변경되었습니다. 이 답변은 정확하지 않으며 허용되는 답변이되어서는 안됩니다.
— d370urn3ur

3
문서에서 weightSum 매개 변수에 대한 설명이 잘 표시되지 않습니다. "예를 들어 layout_weight를 0.5로 설정하고 weightSum을 1.0으로 설정하여 사용 가능한 총 공간의 50 %를 단일 하위 항목에 제공하는 데 사용할 수 있습니다." developer.android.com/reference/android/widget/…
— Deepscorn

5
아이디어는 weightSum을 자식 합계보다 높은 숫자로 설정할 수 있다는 것입니다. 이로 인해 어린이는 사용 가능한 여분의 공간 중 일부만받을 수 있습니다. 위의 예에서 단일 자녀는 전체 공간 대신 ​​사용 가능한 공간의 절반을 상속합니다.
— Edward Falk

175

superM과 Jeff의 답변에 덧붙여서

LinearLayout에 2 개의 뷰가있는 경우, 첫 번째는 layout_weight가 1이고 두 번째는 layout_weight가 2이고 weightSum이 지정되지 않은 경우 기본적으로 weightSum은 3 (자식 가중치의 합)으로 계산됩니다. 첫 번째 뷰는 공간의 1/3을 차지하고 두 번째 뷰는 2/3을 차지합니다.

그러나 weightSum을 5로 지정하면 첫 번째는 공간의 1/5을 차지하고 두 번째는 2/5를 차지합니다. 따라서 나머지 공간을 비워 두는 레이아웃이 총 3/5의 공간을 차지합니다.


2
나는 같은 것을 찾고 있었다. 무게가 정의되지 않고 가중치가 자식보기에 제공되는 경우. 자체 계산에 대한 귀하의 답변은 모든 것을 정리했습니다
— DeltaCap019

weightSum이있는 레이아웃보다 RelativeLayout을 사용하는 것이 좋습니다?
— Robert

26

가중치 합계는 원하는대로 정확하게 작동합니다 (다른 답변과 마찬가지로 부모 레이아웃의 모든 가중치를 합계 할 필요는 없습니다). 자식보기에서 원하는 무게를 지정하십시오. 잊지 말고 지정하십시오

android:layout_width="0dp" 

다음은 예입니다

    <LinearLayout
                android:layout_width="500dp"
                android:layout_height="20dp" >

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="3"
                    android:background="@android:color/holo_green_light"
                    android:gravity="center"
                    android:text="30%"
                    android:textColor="@android:color/white" >
                </TextView>

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="2"
                    android:background="@android:color/holo_blue_bright"
                    android:gravity="center"
                    android:text="20%"
                    android:textColor="@android:color/white" >
                </TextView>

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="5"
                    android:background="@android:color/holo_orange_dark"
                    android:gravity="center"
                    android:text="50%"
                    android:textColor="@android:color/white" >
                </TextView>
 </LinearLayout>

이것은 다음과 같습니다

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


25

문서는 그것을 최고의라고하고, (내 강조)의 예를 포함한다.

android : weightSum

최대 무게 합계를 정의합니다. 지정하지 않으면 모든 자식의 layout_weight를 추가하여 합계가 계산됩니다. 예를 들어 layout_weight에 0.5를 부여하고 weightSum을 1.0으로 설정하여 사용 가능한 총 공간의 50 %를 단일 하위 항목 에 제공하는 데 사용할 수 있습니다 .

올바른 가게되는의 예 그래서, 당신은이 가정 LinearLayout이 포함되어 수평 방향으로 ImageViews과를 TextView함께. TextView고정 크기를 갖도록 정의하고 ImageViews나머지 공간을 동일하게 차지하도록합니다.

이 작업을 수행하려면 적용하지 않을 것이다 layout_weight각각 1 ImageView, 온 것도 TextView, 그리고 weightSum온 2.0을 LinearLayout.


20

몇 가지 실험을 한 후에 LinearLayout의 알고리즘은 다음과 같습니다.

weightSum값으로 설정되어 있다고 가정하십시오 . 결석의 경우는 나중에 설명합니다.

첫째, 분할 weightSum요소의 수에 의해 파크 match_parent나 fill_parent있는 LinearLayout의 치수 (예 : layout_width대 orientation="horizontal"). 이 값 w_m을 각 요소 의 가중치 승수라고합니다 . 의 기본값 weightSum은 1.0이므로 기본 가중치 승수는입니다 1/n. 여기서 요소 n수는 fill_parent입니다. wrap_content요소는에 기여하지 않습니다 n.

w_m = weightSum / #fill_parent

예를 들어 weightSum60이고 3 개의 fill_parent요소가있는 경우 가중치 승수는 20입니다. 가중치 승수는 예를 들어 layout_width속성이없는 경우의 기본값 입니다.

둘째, 모든 요소의 가능한 최대 확장이 계산됩니다. 먼저 wrap_content요소는 내용에 따라 계산됩니다. 확장은 부모 컨테이너의 확장에서 공제됩니다. 우리는 나머지를 부를 것 expansion_remainer입니다. 이 나머지는 fill_parent요소에 따라 요소 들 사이 에 분배 layout_weight됩니다.

셋째, 모든 fill_parent요소 의 확장은 다음과 같이 계산됩니다.

w_m-(layout_weight / w_m) * maximum_possible_expansion

예:

값 weightSum이 60이고 fill_parentweigth 10, 20 및 30을 가진 3 개의 요소가있는 경우 화면에서 펼쳐지는 부모 컨테이너의 2/3, 1/3 및 0/3입니다.

weight | expansion
     0 | 3/3
    10 | 2/3
    20 | 1/3
    30 | 0/3
    40 | 0/3

최소 확장은 0으로 제한됩니다. 최대 확장은 상위 크기로 제한됩니다 (예 : 가중치는 0으로 제한).

요소가로 설정된 경우 해당 요소 wrap_content의 확장이 먼저 계산되고 나머지 확장은 fill_parent요소 간에 분배 됩니다. weightSum설정 하면 요소에 layout_weight영향을 미치지 않습니다 wrap_content. 그러나, wrap_content가중치가 더 낮은 요소 무게 승수(예를 weightSum들어, 위의 예에서 0-1 사이 = 1 또는 0-20 사이)로 요소를 여전히 가시 영역 밖으로 밀어 낼 수 있습니다 .

no weightSum를 지정하면 set! 요소를 포함한 모든 layout_weight값 의 합계로 계산됩니다 . 따라서 요소 를 설정 하면 확장에 영향을 줄 수 있습니다 . 예를 들어 음의 무게는 다른 요소를 축소시킵니다 . 요소를 배치 하기 전에 위의 공식이 요소에 적용되며 , 가능한 최대 확장은 래핑 된 내용에 따라 확장됩니다. 요소는 수축 된 것이며, 그 후에 나머지의 최대 확장 가능한 요소가 계산되고 분배된다.wrap_contentlayout_weightwrap_contentfill_parentfill_parentwrap_contentwrap_contentfill_parent

이로 인해 직관적이지 않은 결과가 발생할 수 있습니다.


10

지정하지 않으면 모든 자식의 layout_weight를 추가하여 합계가 계산됩니다. 예를 들어 layout_weight에 0.5를 부여하고 weightSum을 1.0으로 설정하여 사용 가능한 총 공간의 50 %를 단일 자식에게 제공하는 데 사용할 수 있습니다. "1.2"와 같은 부동 소수점 값이어야합니다

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/main_rel"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:weightSum="2.0" >

        <RelativeLayout
            android:id="@+id/child_one"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="#0000FF" >
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/child_two"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="#00FF00" >
        </RelativeLayout>

    </LinearLayout>

'1.2'와 같은 부동 소수점 값일 수 있습니다. ' ( developer.android.com/reference/android/widget/… )
— 놀라운 1

6

다른 언급이없는 것처럼 보이는 한 가지 : vertical 을 가지고 있다고 가정 해 봅시다 LinearLayout. 그래서 레이아웃 / 요소 /보기의 가중치가 100 % 제대로 작동하려면 모든 layout_height속성이 있어야합니다 (xml에 있어야 함) 파일)을로 설정합니다 0dp. 다른 가치처럼 어떤 경우에는 물건을 망칠 것 같습니다.


1
android : layout_width = "match_parent"는 일반적으로 0dp 대신 사용됩니다
— kc ochibili

왜 이렇게이다? 나는 당신이 엉망이라는 것을 의미하지만 높이를 0dp로 설정하면 문제가 해결되었습니다. 이유를 알고 싶습니다.
— 압둘 Waheed

2

레이아웃 무게는 비율처럼 작동합니다. 예를 들어 세로 레이아웃이 있고 두 개의 항목 (예 : 단추 또는 텍스트보기)이있는 경우 하나는 레이아웃 가중치 2를 갖고 다른 하나는 레이아웃 가중치 3을 갖습니다. 그런 다음 첫 번째 항목은 화면 / 레이아웃의 5 개 중 2 개를 차지하고 5 개 중 3 개를 차지합니다. 여기 5는 가중치 합계입니다. 즉, 가중치 합계는 전체 레이아웃을 정의 된 부분으로 나눕니다. 그리고 레이아웃 가중치는 사전 정의 된 총 가중치 합계에서 특정 항목이 차지하는 부분을 정의합니다. 가중치 합계도 수동으로 선언 할 수 있습니다. UI 디자인에 선형 레이아웃을 사용할 때 버튼, 텍스트보기, 편집 텍스트 등은 모두 가중치 및 레이아웃 가중치를 사용하여 구성됩니다.


1

개발자 문서에서

예를 들어 50%layout_weight에 0.5weightSum을 설정하여 사용 가능한 총 공간 의 단일 하위를 제공하는 데 사용할 수 있습니다 1.0.

@Shubhayu 답변에 추가

나머지 3/5는 레이아웃을 포함하는 특정 부분이 필요하지 않은 다른 자식 레이아웃에 사용할 수 있습니다.

이것은 android:weightSum재산의 잠재적 인 사용입니다 .

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