Android nedir: android'de weightSum ve nasıl çalışır?


Yanıtlar:


133

Belgelere göre, android:weightSummaksimum ağırlık toplamını tanımlar ve layout_weightaçıkça belirtilmediği takdirde tüm çocukların toplamı olarak hesaplanır .

LinearLayoutYatay yönlendirmeli ve ImageViewsiçinde 3 olan bir örneği ele alalım . Şimdi bunların ImageViewsher zaman eşit yer kaplamasını istiyoruz. Bunu başarmak için layout_weight, her ImageViewbirini 1 olarak ayarlayabilirsiniz weightSumve yorumda gösterildiği gibi 3'e eşit olacak şekilde hesaplanır.

<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 , genişliği ve yüksekliği doğrudan ayarlarsanız gerçekleşmeyecek şekilde, herhangi bir cihaz için mizanpajın doğru şekilde oluşturulması için kullanışlıdır.


145
Bu amacının bir açıklaması değildir weightSum. weightSumÖrneğinizdeki davranış atlandı ile aynı olacaktır ve aslında weightSum bu senaryoda belirtilmemelidir. Dokümantasyon , diyorweightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.
Jeff Axelrod

3
@JeffAxelrod: "Belirtilmemeli" mi? Neden? Bunun için bir neden göremiyorum. Bu yüzden sadece belirtilmesine gerek olmadığını söyleyebilirim.
caw

17
@MarcoW .: Sürdürülebilirlik nedeniyle belirtilmemelidir. Jeff'in dediği gibi, weightSum'u mizanpaj içindeki ağırlıkların toplamına eşit olarak ayarlamak hiçbir şey başaramaz, ancak birileri gelecekte değiştirirse, şimdi bulunması gereken mizanpajda gereksiz bir değiştirici vardır. ve değişti. Bu cevap yanlış ve kabul edilen cevap olmamalıdır.
d370urn3ur

3
WeightSum parametresinin iyi bir açıklamasını görmeyin, bu nedenle dokümanlar: "Bu, örneğin, tek bir çocuğa toplam kullanılabilir alanın% 50'sini 0,5 düzen_ağırlığı vererek ve weightSum değerini 1,0'a ayarlayarak kullanılabilir." Bkz. Developer.android.com/reference/android/widget/…
Deepscorn

5
Fikir, weightSum'u çocukların toplamından daha yüksek bir sayıya ayarlayabilmenizdir. Bu, çocukların mevcut fazladan alanın tümünü değil bazılarını almasına neden olur. Yukarıdaki örnekte, tek çocuğunuz tümünün yerine kullanılabilir alanın yarısını devralır.
Edward Falk

175

SuperM ve Jeff'in cevabına ek olarak,

LinearLayout'ta 2 görünüm varsa, birincisi düzen_ağırlık 1, ikincisi düzen_ağırlık 2 ve ağırlıkSum belirtilmez, varsayılan olarak weightSum 3 (çocukların ağırlıklarının toplamı) olarak hesaplanır ve ilk görünüm alanın 1 / 3'ünü alır, ikincisi 2/3 alır.

Bununla birlikte, weightSum değerini 5 olarak belirtirsek, birincisi alanın 1 / 5'ini alırken, ikincisi 2 / 5'i alır. Böylece, alanın toplam 3 / 5'i gerisini boş tutan düzen tarafından işgal edilecektir.


2
Ben de aynısını arıyordum ki, eğer ağırlık tanımlanmamışsa ve çocuk görüşlerine ağırlık sağlanmışsa. Kendi hesapladığı cevabın her şeyi temizledi
DeltaCap019

WeightSum özellikli Layouts'tan RelativeLayout kullanılması önerilir mi?
Robert

26

Ağırlık toplamı tam olarak istediğiniz gibi çalışır (diğer yanıtlar gibi, ana düzendeki tüm ağırlıkları toplamak zorunda değilsiniz). Çocuk görünümünde almasını istediğiniz ağırlığı belirtin. Belirtmeyi unutma

android:layout_width="0dp" 

Aşağıda bir örnek var

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

Bu şöyle görünecek

resim açıklamasını buraya girin


25

Dokümantasyon en iyisi diyor ve, (mayın vurgulayarak) bir örnek içerir.

android: weightSum

Maksimum ağırlık toplamını tanımlar. Belirtilmezse, toplam tüm çocukların layout_weight eklenerek hesaplanır. Bu, örneğin, tek bir çocuğa 0,5 düzen_ağırlığı vererek ve weightSum değerini 1,0 olarak ayarlayarak toplam kullanılabilir alanın% 50'sini vermek için kullanılabilir .

SuperM örneğini düzeltmek LinearLayoutiçin, iki ImageViewsve a içeren yatay yönlendirmeye sahip bir varsayalım TextView. TextViewSabit bir boyuta sahip olduğunu tanımlarsınız ve ikisinin ImageViewskalan alanı eşit olarak almasını istersiniz .

Bunu başarmak layout_weightiçin her birine 1 ImageView, hiçbirinde TextViewve weightSum2.0'da a uygularsınız LinearLayout.


20

Bazı deneme sonra, LinearLayout için algoritma bu olduğunu düşünüyorum:

Bunun weightSumbir değere ayarlandığını varsayın . Devamsızlık durumu daha sonra tartışılacaktır.

İlk olarak, weightSumöğeyi LinearLayout öğesinin boyutuyla match_parentveya fill_parentboyutuyla (ör. layout_widthİçin orientation="horizontal") bölün . Bu değere w_mher eleman için ağırlık çarpanı diyeceğiz . Varsayılan değeri weightSum, 1.0 olduğu çarpan varsayılan ağırlık böylece 1/n, nsayısıdır fill_parentelemanları; wrap_contentunsurlar katkıda bulunmaz n.

w_m = weightSum / #fill_parent

Örneğin weightSum60 olduğunda ve 3 fill_parentöğe olduğunda, ağırlık çarpanı 20'dir. Ağırlık çarpanı, örneğin layout_widthöznitelik yoksa varsayılan değerdir .

İkincisi, her elemanın mümkün olan maksimum genişlemesi hesaplanır. İlk olarak, wrap_contentelementler içeriklerine göre hesaplanır. Genişletmeleri ana kabın genişlemesinden çıkarılır. Kalan kişiyi arayacağız expansion_remainer. Bu geri kalanı fill_parentelementlere göre dağıtılır layout_weight.

Üçüncüsü, her fill_parentelementin genişlemesi şu şekilde hesaplanır:

w_m - (layout_weight / w_m) * maksimum_possible_expansion

Misal:

Eğer weightSum60 ve 3 vardır fill_parentAğırlıkları 10, 20 ve 30 ile elementler, ekranda genişleme 2/3, 1/3 ve ana kabın 0/3 olduğu.

weight | expansion
     0 | 3/3
    10 | 2/3
    20 | 1/3
    30 | 0/3
    40 | 0/3

Minimum genişleme 0 ile sınırlıdır. Maksimum genişleme ana boyutta, yani ağırlıklar 0 ile sınırlıdır.

Bir öğe olarak ayarlanırsa wrap_content, önce genişlemesi hesaplanır ve kalan genişleme fill_parentöğeler arasında dağıtılır . Eğer weightSumayarlanırsa, bu elemanlar layout_weightüzerinde herhangi bir etkiye neden olmaz wrap_content. Bununla birlikte, wrap_contentelemanlar hala ağırlığı daha düşük elemanlar tarafından görülebilir alandan dışarı itilebilir ağırlık çarpanı(örneğin weightSumyukarıdaki örnek için 0-1 arasında veya yukarıdaki örnek için 0-20 arasında).

Hayır weightSumbelirtilirse, setli öğeler dahil olmak üzere tüm layout_weightdeğerlerin toplamı olarak hesaplanır ! Ettikten Yani ayarlanmış elemanları, olabilir onların genişlemesini etkiler. Negatif bir ağırlık diğer elementleri küçültebilir . Öğeler yerleştirilmeden önce, yukarıdaki formül öğelere uygulanacak mı , maksimum olası genişleme sarılmış içeriğe göre genişlemesidir. Elementler büzülmüş olacak ve daha sonra kalan için mümkün olan en genleşme elemanları hesaplanır ve dağıtılır.wrap_contentlayout_weightwrap_contentfill_parentfill_parentwrap_contentwrap_contentfill_parent

Bu, sezgisel olmayan sonuçlara yol açabilir.


10

Belirtilmezse, toplam tüm çocukların layout_weight eklenerek hesaplanır. Bu, örneğin tek bir çocuğa 0,5 düzen_ağırlık vererek ve weightSum değerini 1,0 olarak ayarlayarak toplam kullanılabilir alanın% 50'sini vermek için kullanılabilir. "1.2" gibi bir kayan nokta değeri olmalıdır

    <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" gibi bir kayan nokta değeri olabilir. " ( developer.android.com/reference/android/widget/… )
İnanılmaz

6

Hiç kimsenin bahsetmediği gibi görünen bir şey var: diyelim ki bir dikey var LinearLayout , bu yüzden düzen / öğe / görünüm içindeki ağırlıkların% 100 düzgün çalışması için - hepsinin layout_heightözelliği olmalı (xml'nizde olması gerekir) dosyası) olarak ayarlayın 0dp. Başka bir değer bazı durumlarda işleri karıştırır gibi görünüyor.


1
android: layout_width = "match_parent" genellikle 0dp yerine kullanılır
kc ochibili

Neden böyle? Demek istediğim haklısın, ama yüksekliği 0 dp olarak ayarlamak sorunumu çözdü. sebebini bilmek isterdim.
Abdul Waheed

2

Yerleşim Ağırlığı bir oran gibi çalışır. Örneğin, dikey bir düzen varsa ve biri sırasıyla düzen ağırlığı 2 ve diğeri de düzen ağırlığı 3 olan iki öğe (düğmeler veya metin görünümleri gibi) varsa. Daha sonra 1. öğe ekranın / düzenin 5 bölümünün 2'sini ve diğer öğenin 5 bölümünün 3'ünü kaplar. Burada 5 ağırlık toplamıdır. yani ağırlık toplamı tüm düzeni tanımlı bölümlere ayırır. Düzen Ağırlığı, belirli bir öğenin önceden tanımlanmış toplam Ağırlık Toplamının ne kadar bölümünü kapladığını tanımlar. Ağırlık toplamı da manuel olarak bildirilebilir. Düğmeler, metin görünümleri, düzenleme metinleri vb., UI tasarımı için doğrusal mizanpajlar kullanılırken ağırlık ve mizanpaj ağırlığı kullanılarak düzenlenir.


1

Geliştirici belgelerinden

Bu, örneğin, 50%bir düzen_ağırlığı vererek 0.5ve weightSum değerini ayarlayarak toplam kullanılabilir alanın tek bir alt öğesini vermek için kullanılabilir 1.0.

@Shubhayu yanıtına ek

dinlenme 3/5, düzenin belirli bir bölümüne gerçekten ihtiyaç duymayan diğer çocuk düzenleri için kullanılabilir.

bu potansiyel android:weightSummülkiyet kullanımıdır .

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.