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: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.
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 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.
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
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, nsayısıdır fill_parentelemanları; wrap_contentunsurlar katkıda bulunmaz n.

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

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
(ö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.
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.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 .
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.