안드로이드에서 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_parentfill_parent있는 LinearLayout의 치수 (예 : layout_widthorientation="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.