답변:
문서 당 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
너비와 높이를 직접 설정하면 발생하지 않는 모든 장치에 대해 레이아웃을 올바르게 렌더링하는 데 유용합니다.
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의 공간을 차지합니다.
가중치 합계는 원하는대로 정확하게 작동합니다 (다른 답변과 마찬가지로 부모 레이아웃의 모든 가중치를 합계 할 필요는 없습니다). 자식보기에서 원하는 무게를 지정하십시오. 잊지 말고 지정하십시오
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>
이것은 다음과 같습니다
문서는 그것을 최고의라고하고, (내 강조)의 예를 포함한다.
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
.
몇 가지 실험을 한 후에 LinearLayout의 알고리즘은 다음과 같습니다.
weightSum
값으로 설정되어 있다고 가정하십시오 . 결석의 경우는 나중에 설명합니다.
첫째, 분할 weightSum
요소의 수에 의해 파크 match_parent
나 fill_parent
있는 LinearLayout의 치수 (예 : layout_width
대 orientation="horizontal"
). 이 값 을 각 요소 의 가중치 승수라고합니다 . 의 기본값 weightSum
은 1.0이므로 기본 가중치 승수는입니다 1/n
. 여기서 요소 n
수는 fill_parent
입니다. wrap_content
요소는에 기여하지 않습니다 n
.
예를 들어 weightSum
60이고 3 개의 fill_parent
요소가있는 경우 가중치 승수는 20입니다. 가중치 승수는 예를 들어 layout_width
속성이없는 경우의 기본값 입니다.
둘째, 모든 요소의 가능한 최대 확장이 계산됩니다. 먼저 wrap_content
요소는 내용에 따라 계산됩니다. 확장은 부모 컨테이너의 확장에서 공제됩니다. 우리는 나머지를 부를 것 expansion_remainer
입니다. 이 나머지는 fill_parent
요소에 따라 요소 들 사이 에 분배 layout_weight
됩니다.
셋째, 모든 fill_parent
요소 의 확장은 다음과 같이 계산됩니다.
예:
값 weightSum
이 60이고 fill_parent
weigth 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_content
layout_weight
wrap_content
fill_parent
fill_parent
wrap_content
wrap_content
fill_parent
이로 인해 직관적이지 않은 결과가 발생할 수 있습니다.
지정하지 않으면 모든 자식의 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>
다른 언급이없는 것처럼 보이는 한 가지 : vertical 을 가지고 있다고 가정 해 봅시다 LinearLayout
. 그래서 레이아웃 / 요소 /보기의 가중치가 100 % 제대로 작동하려면 모든 layout_height
속성이 있어야합니다 (xml에 있어야 함) 파일)을로 설정합니다 0dp
. 다른 가치처럼 어떤 경우에는 물건을 망칠 것 같습니다.
레이아웃 무게는 비율처럼 작동합니다. 예를 들어 세로 레이아웃이 있고 두 개의 항목 (예 : 단추 또는 텍스트보기)이있는 경우 하나는 레이아웃 가중치 2를 갖고 다른 하나는 레이아웃 가중치 3을 갖습니다. 그런 다음 첫 번째 항목은 화면 / 레이아웃의 5 개 중 2 개를 차지하고 5 개 중 3 개를 차지합니다. 여기 5는 가중치 합계입니다. 즉, 가중치 합계는 전체 레이아웃을 정의 된 부분으로 나눕니다. 그리고 레이아웃 가중치는 사전 정의 된 총 가중치 합계에서 특정 항목이 차지하는 부분을 정의합니다. 가중치 합계도 수동으로 선언 할 수 있습니다. UI 디자인에 선형 레이아웃을 사용할 때 버튼, 텍스트보기, 편집 텍스트 등은 모두 가중치 및 레이아웃 가중치를 사용하여 구성됩니다.
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.