Bilmek istiyorum: android nedir: weightSum ve düzen ağırlığı ve nasıl çalışır?
Bilmek istiyorum: android nedir: weightSum ve düzen ağırlığı ve nasıl çalışır?
Yanıtlar:
Belgelere göre, android:weightSum
maksimum ağırlık toplamını tanımlar ve layout_weight
açıkça belirtilmediği takdirde tüm çocukların toplamı olarak hesaplanır .
LinearLayout
Yatay yönlendirmeli ve ImageViews
içinde 3 olan bir örneği ele alalım . Şimdi bunların ImageViews
her zaman eşit yer kaplamasını istiyoruz. Bunu başarmak için layout_weight
, her ImageView
birini 1 olarak ayarlayabilirsiniz weightSum
ve 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.
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.
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
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 LinearLayout
için, iki ImageViews
ve a içeren yatay yönlendirmeye sahip bir varsayalım TextView
. TextView
Sabit bir boyuta sahip olduğunu tanımlarsınız ve ikisinin ImageViews
kalan alanı eşit olarak almasını istersiniz .
Bunu başarmak layout_weight
için her birine 1 ImageView
, hiçbirinde TextView
ve weightSum
2.0'da a uygularsınız LinearLayout
.
Bazı deneme sonra, LinearLayout için algoritma bu olduğunu düşünüyorum:
Bunun weightSum
bir değere ayarlandığını varsayın . Devamsızlık durumu daha sonra tartışılacaktır.
İlk olarak, weightSum
öğeyi LinearLayout öğesinin boyutuyla match_parent
veya fill_parent
boyutuyla (ör. layout_width
İçin orientation="horizontal"
) bölün . Bu değere her 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
, n
sayısıdır fill_parent
elemanları; wrap_content
unsurlar katkıda bulunmaz n
.
Örneğin weightSum
60 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_content
elementler 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_parent
elementlere göre dağıtılır layout_weight
.
Üçüncüsü, her fill_parent
elementin genişlemesi şu şekilde hesaplanır:
Misal:
Eğer weightSum
60 ve 3 vardır fill_parent
Ağı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 weightSum
ayarlanırsa, bu elemanlar layout_weight
üzerinde herhangi bir etkiye neden olmaz wrap_content
. Bununla birlikte, wrap_content
elemanlar hala ağırlığı daha düşük elemanlar tarafından görülebilir alandan dışarı itilebilir (örneğin weightSum
yukarıdaki örnek için 0-1 arasında veya yukarıdaki örnek için 0-20 arasında).
Hayır weightSum
belirtilirse, setli öğeler dahil olmak üzere tüm layout_weight
değ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_content
layout_weight
wrap_content
fill_parent
fill_parent
wrap_content
wrap_content
fill_parent
Bu, sezgisel olmayan sonuçlara yol açabilir.
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>
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.
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.
Geliştirici belgelerinden
Bu, örneğin, 50%
bir düzen_ağırlığı vererek 0.5
ve 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:weightSum
mülkiyet kullanımıdır .
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.