Android'de Doğrusal Düzen ve ağırlık


262

Android belgelerinde her zaman bu komik ağırlık değerini okudum. Şimdi ilk kez denemek istiyorum ama hiç çalışmıyor.

Belgelerden anladığım gibi bu düzen:

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

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

  </LinearLayout>

yatay olarak hizalanmış ve alanı eşit olarak paylaşan iki düğme oluşturmalıdır. Sorun, iki düğmenin alanı doldurmak için büyümemesi.

Düğmelerin büyümesini ve tüm çizgiyi doldurmasını istiyorum. Her iki düğme de ebeveyne uyacak şekilde ayarlanmışsa, yalnızca ilk düğme gösterilir ve tüm satırı doldurur.


güncelleme: android yüzde desteği de bunu çok iyi yapabilir. code2concept.blogspot.in/2015/08/…
nitesh

Yanıtlar:


160

Sen ayarlamıyorsanız layout_weightözelliği. Kodunuz okunur weight="1"ve okunmalıdır android:layout_weight="1".


684

Hatırlamanız gereken 3 şey:

  • set layout_width: android çocukların "0DP"
  • set weightSum: android ebeveynin ( düzenleme: Jason Moore fark olarak, bu özellik isteğe bağlı olduğundan varsayılan olarak çocukların layout_weight toplamına ayarlandığı için)
  • set android: layout_weight orantılı Her çocuğun (örneğin weightSum = "5", üç çocuk: layout_weight = "1", layout_weight = "3", layout_weight = "1")

Misal:

    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="5">

    <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="3"
        android:text="2" />

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

    </LinearLayout>

Ve sonuç:

Yerleşim ağırlığı örneği


66
Genişliği sıfıra ayarlama ipucu için teşekkürler. Ayrıca ebeveyn üzerinde weightSum ayarının gerekli olmadığını da buldum.
Jason Moore

30
Bilmek güzel, teşekkürler. Öyleyse, weightSum öğesinin ayarlanması, çocukların ebeveynin% 100'ünü doldurmasını istemediğinizde yine de yararlı olabilir.
Anke

13
Bu, statik XML düzenleri için doğrudur. Görünümleri çalışma zamanında dinamik olarak ekliyorsanız, mizanpajları addView(button, new LinearLayout.LayoutParams(0, height, 1));doğru genişlik ve ağırlık değerleriyle şişiriyor olsanız bile, bu doğrudur.
Nuthatch

Ebeveynin android: weightSum setini söyleyin - bir değere ayarlayın veya sadece koyun, bu nasıl ayarlanmalıdır?
theJerm

1
@batbrat doğru, dinamik olarak kullanıcı arayüzü oluşturuyordum. Bazen XML parçalarını şablon olarak ele alıyorum ve sonra çalışma zamanında değiştiriyorum veya dolduruyorum. Bu hile benim için işe yaramadı, bu durumda, işe yaraması için açık genişliği ve ağırlığı yeniden ayarlamak zorunda kaldım.
Nuthatch

52

Öyle android:layout_weight. Ağırlık sadece LinearLayout. Doğrusal yerleşimin yönü Dikey ise, yönünü yataysa android:layout_height="0dp"kullanın android:layout_width = "0dp". Mükemmel çalışır.



16

Belirlemeyi deneyin layout_width"0dip" ve her iki düğmeleri weighther iki düğme için0.5


Şimdi her iki düğme de ekrandan kayboluyor
Janusz

tamam, ardından düzen genişliğini
dolgu_eklemi

bir göz atın bu ve bu . Bunun neden hala işe yaramadığı konusunda biraz kafam karıştı, ama belki bu size bazı fikirler verecektir.
jqpubliq

7

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. Varsayılan ağırlık sıfırdır

Çocuk arasında kalan / Ekstra boşluk atamak için hesaplama . (toplam alan değil)

çocuğa atanan alan = (çocuğun bireysel ağırlığı) / (Doğrusal Düzen içindeki her çocuğun ağırlığı toplamı)

Örnek (1): üç metin kutusu varsa ve bunlardan ikisi ağırlık 1 belirtirken, üçüncü kutuya ağırlık verilmezse (0), sonra Kalan / Ekstra alan

1st text box = 1/(1+1+0) 
2nd text box = 1/(1+1+0) 
3rd text box = 0/(1+1+0) 

Örnek (2) : diyelim ki yatay bir satırda bir metin etiketi ve iki metin düzenleme öğesi 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ü eşit derecede önemli olduklarını iddia ederiz).

calculation : 
1st label = 0/(0+1+1) 
2nd text box = 1/(0+1+1) 
3rd text box = 1/(0+1+1)

İlk metin kutusunun düzen_ağırlığı 1 ise ve ikinci metin kutusunun düzen_ağırlığı 2 ise, kalan boşluğun üçte biri birinciye, ikincisinin üçte ikisi verilir (ikincisinin daha önemli).

calculation : 
1st label = 0/(0+1+2) 
2nd text box = 1/(0+1+2) 
3rd text box = 2/(0+1+2) 

7

Düğme genişliği alanında, yerine wrap-contentile 0dp.
Bir görünümün layout_weight özelliğini kullanın.

android:layout_width="0dp"  

Kodunuz şöyle görünecektir:

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

 <Button
    android:text="Register"
    android:id="@+id/register"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />

 <Button
    android:text="Not this time"
    android:id="@+id/cancel"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />    

</LinearLayout>

layout_weight, kalan boşluğu oranlara dağıtmak için kullanılır. Bu durumda, iki düğme "0dp" genişliğini alır. Böylece, kalan boşluk aralarında 1: 1 oranına bölünecektir, yani boşluk Düğme Görünümleri arasında eşit olarak bölünecektir.


6

@Manoj Seelan'ın cevabı gibi

Değiştir android:layout_weightBirlikte android:weight.

Ne zaman kullanmak Ağırlık ile LinearLayout. Eklemek gerekir weightSumiçinde LinearLayoutsenin yönüne göre ve LinearLayoutayarını gerekir 0dptümüne Genişlik için / Yükseklik LinearLayout`Çocuklar görüşlerini s

Misal :

Eğer yönelimi Linearlayoutolan Vertical, daha sonra tüm genişliğini ayarlamak LinearLayout`çocuklar incelemeler s0dp

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

Eğer yönlendirme Linearlayouttaşımaktadır horizontalhepsinden daha sonra Set Yüksekliği LinearLayout`Çocuklar görüşlerini s 0dp.

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

5

Belki de layout_width özelliklerinin her ikisinin de "fill_parent" olarak ayarlanması hileyi yapar.

Ben sadece bu kodu test ve emülatör çalışır:

<LinearLayout android:layout_width="fill_parent"
          android:layout_height="wrap_content">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="hello world"/>

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="goodbye world"/>

</LinearLayout>

Her iki düğmede layout_width değerini "fill_parent" olarak ayarladığınızdan emin olun.


1
bu yalnızca sağ düğmeyi ekranın dışına iter ve yalnızca ilk düğmeyi gösterir.
Janusz

4
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/logonFormButtons"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"       
        android:orientation="horizontal">

        <Button
            android:id="@+id/logonFormBTLogon"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/logon"
            android:layout_weight="0.5" />

        <Button
            android:id="@+id/logonFormBTCancel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/cancel"
            android:layout_weight="0.5" />
    </LinearLayout>

Şimdi doğrusu layout_weight kullanmanızı öneririz ediyorum = "50" ve layout_width = "0px"
Yar

2

Yukarıdaki XML'de, android:layout_weightdoğrusal mizanpajı şu şekilde ayarlayın 2: android:layout_weight="2"


3
Neden gerekli? Yerleşim ağırlığı 2 neden önemlidir? Neden 20 veya 200 değil?
Conrad Frix

2

Ayrıca, bu android:layout_width="0dp"öğenin çocuk görünümleri [Düğme görünümleri] için eklemeniz gerekirLinerLayout


2

Bunun gibi yazmak zorundasın benim için çalışıyor

<LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
            android:weightSum="2">

         <Button
            android:text="Register"
            android:id="@+id/register"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

         <Button
            android:text="Not this time"
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

2

Kodunuzdaki değişiklikler ( BOLD olarak işaretlenmiştir ):

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

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

  </LinearLayout>

LinearLayout'unuz yatay olarak yönlendirildiğinden, genişliğinizi yalnızca 0dp olarak tutmanız gerekir. ağırlıkları bu yönde kullanmak için. (Yönünüz dikey olsaydı, boyunuzu sadece 0dp tutardınız) .

2 görünüm olduğundan ve android:layout_weight="1"her iki görünüm için de yerleştirdiğinizden , bu, iki görünümü yatay yönde (veya genişlikle) eşit olarak böleceği anlamına gelir.


1
 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 1" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="Button 2" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 3" />

    </LinearLayout>

0

Bu sorunun mükemmel bir cevabı

  <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="horizontal"  >   
     <Button 
        android:text="Register" android:id="@+id/register"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
     <Button 
        android:text="Not this time" android:id="@+id/cancel"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
  </LinearLayout>

3
Yani "ağırlık" veya "layout_weight" ??
IgorGanapolsky

Android: layout_weight
Mahendra


0
 <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:background="#008">

            <RelativeLayout
                android:id="@+id/paneltamrin"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"

                >
                <Button
                    android:id="@+id/BtnT1"
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                    android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/paneltamrin2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                >
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                     android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />

            </RelativeLayout>
        </LinearLayout>

resim açıklamasını buraya girin

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.