code

android : layout_weight는 무엇을 의미합니까?

codestyles 2020. 10. 2. 22:22
반응형

android : layout_weight는 무엇을 의미합니까?


이 속성을 사용하는 방법을 이해하지 못합니다. 누구든지 그것에 대해 더 말할 수 있습니까?


함께 layout_weight사용하면 여러보기 사이의 크기 비율을 지정할 수 있습니다. 예 : 당신은이 MapViewtable지도에 몇 가지 추가 정보를 표시해야하는가. 지도는 화면의 3/4를 사용하고 테이블은 화면의 1/4을 사용해야합니다. 그런 다음 layout_weightmap를 3으로 설정 하고 layout_weight의의 table를 1로 설정합니다.

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


간단히 말해서, 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이고 두 번째 텍스트 상자의 a layout_weight가 2이면 나머지 공간의 1/3이 첫 번째 공간에, 2/3가 두 번째 공간에 주어집니다 (우리가 두 번째 하나가 더 중요합니다).

계산:

첫 번째 레이블 = 0 / (0 + 1 + 2)

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

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


소스 기사


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

android:layout_width="0px"

그렇지 않으면 쓰레기가 보일 것입니다


에 걸쳐있는 여러보기가있는 경우 각각에 비례하는 크기 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 인 십진수를 사용하여 복잡한 레이아웃에서 각 부품의 무게가 무엇인지 명확하게합니다.

마지막 메모입니다. 를 사용하는 중첩 레이아웃이 많으면 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>

layout_weight tells Android how to distribute your Views in a LinearLayout. Android then first calculates the total proportion required for all Views that have a weight specified and places each View according to what fraction of the screen it has specified it needs. In the following example, Android sees that the TextViews have a layout_weight of 0 (this is the default) and the EditTexts have a layout_weight of 2 each, while the Button has a weight of 1. So Android allocates 'just enough' space to display tvUsername and tvPassword and then divides the remainder of the screen width into 5 equal parts, two of which are allocated to etUsername, two to etPassword and the last part to 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>

It looks like:
가로 방향 and
세로 방향


Think it that way, will be simpler

If you have 3 buttons and their weights are 1,3,1 accordingly, it will work like table in HTML

Provide 5 portions for that line: 1 portion for button 1, 3 portion for button 2 and 1 portion for button 1

Regard,


one of the best explanations for me was this one (from the Android tutorial, look for step 7):

layout_weight is used in LinearLayouts to assign "importance" to Views within the layout. All Views have a default layout_weight of zero, meaning they take up only as much room on the screen as they need to be displayed. Assigning a value higher than zero will split up the rest of the available space in the parent View, according to the value of each View's layout_weight and its ratio to the overall layout_weight specified in the current layout for this and other View elements.

To give an example: let's say we have a text label and two text edit elements in a horizontal row. The label has no layout_weight specified, so it takes up the minimum space required to render. If the layout_weight of each of the two text edit elements is set to 1, the remaining width in the parent layout will be split equally between them (because we claim they are equally important). If the first one has a layout_weight of 1 and the second has a layout_weight of 2, then one third of the remaining space will be given to the first, and two thirds to the second (because we claim the second one is more important).


http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout

layout_weight defines how much space the control must obtain respectively to other controls.


Please look at the weightSum of LinearLayout and the layout_weight of each View. android:weightSum="4" android:layout_weight="2" android:layout_weight="2" Their layout_height are both 0px, but I am not sure it is relevan

<?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>

For additional

For vertical orientation, don't forget set height to 0dp

android:layout_height="0dp"

For horizontal orientation, don't forget set width to 0dp

android:layout_width="0dp"

Combining both answers from

Flo & rptwsthi and roetzi,

Do remember to change your layout_width=0dp/px, else the layout_weight behaviour will act reversely with biggest number occupied the smallest space and lowest number occupied the biggest space.

Besides, some weights combination will caused some layout cannot be shown (since it over occupied the space).

Beware of this.


Adding android:autoSizeTextType="uniform" will resize the text for you automatically


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

참고 URL : https://stackoverflow.com/questions/3995825/what-does-androidlayout-weight-mean

반응형