Android: layout_weight ne anlama geliyor?


Yanıtlar:


860

İle layout_weightbirden çok görünüm arasında bir boyut oranı belirleyebilirsiniz. Örneğin , haritaya bazı ek bilgiler göstermesi gereken bir MapViewve bir bilginiz var table. Harita ekranın 3 / 4'ünü ve tablo ekranın 1 / 4'ünü kullanmalıdır. Sonra koyacaktır layout_weightarasında map3 ve layout_weightiçinde table1.

Çalışması için yüksekliği veya genişliği (yönlendirmenize bağlı olarak) 0 piksel olarak ayarlamanız gerekir.


208
0px yükseklikten bahsedene kadar kafa çizici!
JohnnyLambada

24
Hangilerinin ağırlıktan etkileneceğini tanımlamak. Genişlik veya yükseklik.
neteinstein

30
0px'e ihtiyacınız var. Örnek: İki eşit sütuna sahip bir tablo uygulamak istiyorsunuz. Her tablo satırı, her biri layout_weight = .5 olan iki "tablo hücresi" (örneğin, TextViews) içeren yatay bir doğrusal mizanpajdır. "Tablo hücreleri" üzerinde layout_width = "wrap_content" belirtirseniz, içerik genişliği layout_weight tarafından hesaplanan genişliğe eklenir, tablo hücreleri tamamen farklı boyutlarda olur ve sütunlar doğru şekilde hizalanmaz. Bu nedenle android'in hücrelerin genişliğini hesaplamak için layout_weight'i kullanması için layout_width = 0dp ayarlamanız gerekir.
eeeeaaii

3
@Solace, geç cevap, ama bütünlük uğruna .. Kilo niteliği RelativeLayout'a katkıda bulunmuyor gibi görünüyor. Yalnızca LinearLayout ile çalışır. Ağırlık gereksinimi görürseniz, belki de gidilecek yol RelativeLayout içinde bir LinearLayout (ağırlıklarla) oluşturmaktır.
bbv

1
layout_weight yalnızca doğrusal düzen için çalışır veya her görünüm grubu için çalışır.
meShakti

247

Özetle, görünümdeki fazladan alanın ne kadarının görünüme layout_weightayrılacağını belirtir.

LinearLayout, bireysel çocuklara ağırlık atamayı destekler. Bu öznitelik bir görünüme "önem" değeri atar ve üst görünümde kalan boşlukları dolduracak şekilde genişlemesine olanak tanır. Görünümlerin varsayılan ağırlığı sıfırdır.

Çocuk arasında kalan boşluk atamak için hesaplama

Genel olarak formül:

çocuğa atanan alan = (çocuğun bireysel ağırlığı) / (Doğrusal Yerleşimdeki her çocuğun ağırlığı toplamı)

örnek 1

Üç metin kutusu varsa ve bunlardan ikisi ağırlık 1 olarak beyan edilirken, üçüncü kutuya ağırlık verilmezse (0), kalan alan aşağıdaki gibi atanır:

1. metin kutusu = 1 / (1 + 1 + 0)

2. metin kutusu = 1 / (1 + 1 + 0)

3. metin kutusu = 0 / (1 + 1 + 0)

ÖRNEK 2

Diyelim ki yatay bir satırda bir metin etiketi ve iki metin düzenleme öğesi var. Etikette layout_weightbelirtilmiş olmadığından, oluşturulması için gereken minimum yer kaplar. Eğer layout_weightiki metin düzenleme elemanlarının her birinin 1 olarak ayarlanır (onlar aynı derecede önemli İstem için), üst düzeninde kalan genişliği arasında eşit bölünmüş olacaktır.

Hesaplama:

1. etiket = 0 / (0 + 1 + 1)

2. metin kutusu = 1 / (0 + 1 + 1)

3. metin kutusu = 1 / (0 + 1 + 1)

Bunun yerine, ilk metin kutusunun layout_weight1 değeri varsa ve ikinci metin kutusunun layout_weightdeğeri 2 ise, kalan boşluğun üçte biri birinci, üçte ikisi ikinciye verilir (çünkü ikinci biri daha önemlidir).

Hesaplama:

1. etiket = 0 / (0 + 1 + 2)

2. metin kutusu = 1 / (0 + 1 + 2)

3. metin kutusu = 2 / (0 + 1 + 2)


Kaynak makale


19
Şu anda seçili cevaptan çok daha iyi bir açıklama.
Gölge

12
Basit bir açıklama (ki takdir ediyorum) ve nit cesur ayrıntılar (ki farklı bir şekilde takdir ediyorum) var. İkisi de iyi cevaplar.
cbmanica

3
Başka yerlerde de belirtildiği gibi android:layout_width="0px"önemlidir. Ayrıca, ağırlıkların tamsayı olması gerekmez.
Brian White

Bu, seçilen cevaptan anlaşılması biraz daha zordur, ancak tam bir cevap verir - özellikle bazı görüşlerin ağırlıkları var ve bazıları yokken. Bu, seçilen yanıtın kapsamadığı büyük bir kullanım örneğidir.
Acey

weightSumresme nereden geliyor? Bununla bir ilgisi var layout_weightmı?
eRaisedToX

72

diğer cevaplara ek olarak, bunun işe yaraması için en önemli şey mizanpaj genişliğini (veya yüksekliğini) 0 piksel olarak ayarlamaktır

android:layout_width="0px"

aksi takdirde çöp görürsünüz


Bence ağırlıklarını tanımlamayan görünümleri gizlemek veya boyutuna sığacak boyutta göstermek ve kalan boş alanı "ağırlıklı" görünümlere bırakmak isteyip istemediğinize bağlı.
Andrea Leganza

Hem yatay hem de dikey ağırlık ayarlamam gerekirse ne olur?
Alston

40

A'yı kapsayan birden çok görünüm varsa LinearLayout, layout_weighther birine orantılı bir boyut verir. Daha büyük bir layout_weightdeğere sahip bir görünüm daha ağırdır, böylece daha büyük bir alan elde edilir.

İşte işleri daha net hale getirmek için bir görüntü.

resim açıklamasını buraya girin

teori

Yerleşim ağırlığı terimi , matematikteki ağırlıklı ortalama kavramı ile ilgilidir . Ödev% 30, devam% 10, ara sınav% 20 ve final% 40 değerinde bir üniversite sınıfında olduğu gibidir. Bu parçalar için aldığınız puanlar, birlikte ağırlıklandırıldığında size toplam notunuzu verir.

resim açıklamasını buraya girin

Düzen ağırlığı için de aynıdır. ViewsBir yatay olarak LinearLayouther biri toplam genişliğinin belli bir yüzdesi kadar sürebilir. (Veya dikey için yüksekliğin yüzdesi LinearLayout.)

Tasarım

Kullandığınız LinearLayoutşuna benzer:

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

    <!-- list of subviews -->

</LinearLayout>

Eğer kullanması gerektiğini Not layout_width="match_parent"için LinearLayout. Eğer kullanırsanız wrap_content, o zaman işe yaramaz. Ayrıca layout_weight, RelativeLayouts'taki görünümler için çalışmadığını unutmayın ( bu sorunla ilgili SO cevapları için buraya ve buraya bakın ).

Görüntüler

Yataydaki her görünüm LinearLayoutşöyle görünür:

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

layout_width="0dp"Birlikte kullanmanız gerektiğini unutmayın layout_weight="1". Bunu unutmak birçok yeni kullanıcı sorununa neden olur. ( Genişliği 0 olarak ayarlayarak elde edebileceğiniz farklı sonuçlar için bu makaleye bakın. ) Görüşleriniz dikeyse , elbette LinearLayoutkullanabilirsiniz layout_height="0dp".

In ButtonI Yukarıdaki örnekte 1 olarak ağırlığını ayarlamak, ancak herhangi bir numarayı kullanabilirsiniz. Önemli olan sadece toplamdır. Gönderdiğim ilk görüntüdeki üç düğme satırında görebilirsiniz, sayıların hepsi farklıdır, ancak oranlar aynı olduğundan, ağırlıklı genişlikler her satırda değişmez. Bazı insanlar toplamı 1 olan ondalık sayıları kullanmayı sever, böylece karmaşık bir düzende her parçanın ağırlığının ne olduğu açıktır.

Son bir not. Kullanan çok sayıda iç içe düzeniniz varsa layout_weight, performans için kötü olabilir.

Ekstra

En iyi görüntü için xml düzeni şöyledir:

<?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
Her zaman neden daha fazla insanın XML'lerine eşlik etmek için resim yayınlamadığını merak ediyorum. Görselleri anlamak koddan çok daha kolaydır.
AleksandrH

30

layout_weightAndroid cihazına Viewa LinearLayout. Daha sonra Android önce Viewbelirtilen ağırlığı olan tüm s için gereken toplam oranı hesaplar ve her Viewbirini ekranın hangi kısmına ihtiyaç duyduğuna göre yerleştirir. Aşağıdaki örnekte, Android görür TextViewler bir var layout_weightbir 0(varsayılan ayar) ve EditTextler bir var layout_weightbir 2süre, her Buttonbir ağırlığa sahiptir 1. Yani Android ayırır 'yeterli' ekrana uzay tvUsernameve tvPasswordsonra ve tahsis edilir ikisi 5 eşit parçaya ekran genişliğinin kalan böler etUsername, iki etPasswordve son bölüm 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>

Şöyle görünüyor:
yatay yönlendirme ve
dikey yönlendirme


bağlantı artık mevcut değil. Başka bir iyi referansınız varsa, lütfen güncelleyin.
BinaryGuy

16

Bu şekilde düşün, daha basit olacak

3 düğmeniz varsa ve ağırlıkları 1,3,1 ise, HTML'deki tablo gibi çalışır

Bu hat için 5 kısım sağlayın: Düğme 1 için 1 kısım, Düğme 2 için 3 kısım ve Düğme 1 için 1 kısım

Saygı,


10

benim için en iyi açıklamalardan biri bu idi (Android öğreticisinden, adım 7'ye bakın) :

layout_weight, düzen içindeki Görünümlere "önem" atamak için LinearLayouts'ta kullanılır. Tüm Görünümlerin varsayılan düzen_ağlığı sıfırdır, yani ekranda görüntülenmeleri için yalnızca yer kaplarlar. Sıfırdan daha yüksek bir değer atamak, her Görünüm'ün düzen_ağırlığının değerine ve bu ve diğer Görünüm öğeleri için geçerli mizanpajda belirtilen genel düzen_ağırlığına oranına göre üst görünümdeki kullanılabilir alanın geri kalanını böler.

Bir örnek vermek gerekirse: diyelim ki yatay bir satırda bir metin etiketimiz ve iki metin düzenleme öğemiz var. Etikette belirtilen layout_weight yoktur, bu nedenle oluşturulması için gereken minimum alanı kaplar. İki metin düzenleme öğesinin her birinin düzen_ağırlığı 1 olarak ayarlanırsa, üst düzende kalan genişlik aralarında eşit olarak bölünür (çünkü aynı derecede önemli olduklarını iddia ederiz). Birincisinin düzen_ağırlığı 1 ve ikincisinin düzen_ağırlığı 2 ise, kalan boşluğun üçte biri birinciye, ikincisinin üçte ikisi verilir (çünkü ikincisinin daha önemli olduğunu iddia ederiz).



4

Ek: için

İçin verticaloryantasyon, set unutma height0DP için

android:layout_height="0dp"

İçin horizontaloryantasyon, set unutma width0DP için

android:layout_width="0dp"

3

Lütfen her bir Görünümün LinearLayout'un weightSumum'una ve layout_weight değerine bakın. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Onların layout_height her ikisi de 0px, ancak relevan olduğundan emin değilim

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

Lütfen her bir Görünümün LinearLayout'un weightSumum'una ve layout_weight değerine bakın. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Onların layout_height her ikisi de 0px, ancak alakalı olduğundan emin değilim.
Ming Leung

0

Her iki yanıtı birleştirmek

Flo & rptwsthi ve roetzi,

Değiştirmeyi unutmayın layout_width=0dp/px, yoksa en layout_weightbüyük sayı en küçük alanı işgal eden ve en az sayı en büyük alanı işgal eden davranış ters olarak hareket edecektir.

Ayrıca, bazı ağırlık kombinasyonları bazı düzenlerin gösterilememesine neden olacaktır (bu alan üzerinde yer kapladığından).

Buna dikkat et.


0

Ekleme android:autoSizeTextType="uniform", metni sizin için otomatik olarak yeniden boyutlandırır


-1

Adından da anlaşılacağı gibi, Düzen ağırlığı, belirli bir alanın veya widget'ın ekran alanını işgal etmesi gereken alan miktarını veya yüzdesini belirtir.
Ağırlığı yatay yönde belirtirsek, o zaman belirtmeliyiz layout_width = 0px.
Benzer şekilde, ağırlığı dikey yönde belirtirsek, o zaman belirtmeliyiz layout_height = 0px.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.