ฉันต้องการทราบ: Android คืออะไรน้ำหนักและรูปแบบน้ำหนักและพวกเขาทำงานอย่างไร
ฉันต้องการทราบ: Android คืออะไรน้ำหนักและรูปแบบน้ำหนักและพวกเขาทำงานอย่างไร
คำตอบ:
ตามเอกสารandroid:weightSum
กำหนดน้ำหนักรวมสูงสุดและคำนวณเป็นผลรวมของlayout_weight
ทั้งหมดหากไม่ได้ระบุไว้อย่างชัดเจน
ลองพิจารณาตัวอย่างที่มีการLinearLayout
วางแนวนอนและ 3 ImageViews
ข้างใน ตอนนี้เราต้องการให้สิ่งเหล่านี้ImageViews
ใช้พื้นที่ว่างเสมอ เพื่อให้บรรลุสิ่งนี้คุณสามารถตั้งค่าlayout_weight
ของแต่ละค่าImageView
เป็น 1 และค่าweightSum
จะถูกคำนวณให้เท่ากับ 3 ตามที่แสดงในความคิดเห็น
<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
มีประโยชน์สำหรับการจัดวางเลย์เอาต์อย่างถูกต้องสำหรับอุปกรณ์ใด ๆ ซึ่งจะไม่เกิดขึ้นหากคุณตั้งค่าความกว้างและความสูงโดยตรง
การเพิ่มคำตอบของ superM และ Jeff
หากมีมุมมอง 2 แบบใน LinearLayout รายการแรกที่มี layout_weight 1, ครั้งที่สองที่มี layout_weight 2 และไม่ระบุ weightSum โดยค่าเริ่มต้น WeightSum จะถูกคำนวณเป็น 3 (ผลรวมของน้ำหนักของเด็ก) และ มุมมองแรกใช้พื้นที่ 1/3 ในขณะที่มุมมองที่สองใช้เวลา 2/3
อย่างไรก็ตามหากเราต้องระบุน้ำหนักผลรวมเป็น 5 อันดับแรกจะใช้เวลา 1 / 5th ของพื้นที่ส่วนที่สองจะใช้ 2 / 5th ดังนั้นพื้นที่ทั้งหมดจะถูกจัดไว้ให้โดยส่วนที่เหลือของส่วนที่เหลือทั้งหมด
น้ำหนักรวมทำงานได้ตามที่คุณต้องการ (เช่นคำตอบอื่น ๆ ที่คุณไม่ต้องรวมน้ำหนักทั้งหมดในเค้าโครงหลัก) ในมุมมองเด็กระบุน้ำหนักที่คุณต้องการใช้ อย่าลืมระบุ
android:layout_width="0dp"
ต่อไปนี้เป็นตัวอย่าง
<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>
จะมีลักษณะเช่นนี้
เอกสารกล่าวว่าดีที่สุดและรวมถึงตัวอย่าง (เหมืองไฮไลท์)
หุ่นยนต์: weightSum
กำหนดผลรวมน้ำหนักสูงสุด หากไม่ได้ระบุผลรวมจะถูกคำนวณโดยการเพิ่ม layout_weight ของลูกทั้งหมด สิ่งนี้สามารถนำมาใช้เพื่อให้ลูกคนเดียว 50% ของพื้นที่ว่างทั้งหมดโดยให้ layout_weight 0.5 และตั้งค่า weightSum เป็น 1.0
ดังนั้นเพื่อแก้ไขตัวอย่างของ superM สมมติว่าคุณมีการLinearLayout
วางแนวแนวนอนที่มีสองImageViews
และ a TextView
ด้วย คุณกำหนดTextView
ให้มีขนาดคงที่และคุณต้องการให้ทั้งสองImageViews
ใช้พื้นที่ที่เหลือเท่ากัน
เพื่อให้บรรลุนี้คุณจะใช้layout_weight
1 ถึงแต่ละImageView
ไม่มีบนTextView
และweightSum
2.0 LinearLayout
ใน
หลังจากการทดลองฉันคิดว่าอัลกอริทึมสำหรับ LinearLayout คือ:
สมมติว่า weightSum
มีการตั้งค่า กรณีที่ขาดหายไปจะกล่าวถึงในภายหลัง
ก่อนอื่นหารweightSum
ด้วยจำนวนขององค์ประกอบที่อยู่match_parent
หรือfill_parent
ในมิติของ LinearLayout (เช่นlayout_width
สำหรับorientation="horizontal"
) เราจะเรียกค่านี้ว่าตัวคูณน้ำหนักสำหรับแต่ละองค์ประกอบ ค่าเริ่มต้นสำหรับweightSum
คือ 1.0 ดังนั้นตัวคูณน้ำหนักเริ่มต้นคือ1/n
โดยที่n
จำนวนfill_parent
องค์ประกอบ; องค์ประกอบที่ไม่นำไปสู่wrap_content
n
เช่นเมื่อweightSum
เป็น 60 และมี 3 fill_parent
องค์ประกอบตัวคูณน้ำหนักคือ 20 ตัวคูณน้ำหนักเป็นค่าเริ่มต้นสำหรับเช่นlayout_width
หากไม่มีแอตทริบิวต์
ประการที่สองการคำนวณการขยายตัวสูงสุดที่เป็นไปได้ของทุกองค์ประกอบ ก่อนwrap_content
องค์ประกอบจะถูกคำนวณตามเนื้อหาของพวกเขา การขยายตัวของพวกเขาจะถูกหักออกจากการขยายตัวของภาชนะแม่ เราจะเรียก expansion_remainer
remainer ส่วนที่เหลือนี้ถูกกระจายfill_parent
ไปตามองค์ประกอบต่างๆlayout_weight
ต่างๆ
ประการที่สามการขยายตัวของทุกfill_parent
องค์ประกอบถูกคำนวณดังนี้
ตัวอย่าง:
ถ้าweightSum
60 และมี 3 fill_parent
องค์ประกอบที่มี weigths 10, 20 และ 30 การขยายของพวกเขาบนหน้าจอคือ 2/3, 1/3 และ 0/3 ของคอนเทนเนอร์พาเรนต์
weight | expansion
0 | 3/3
10 | 2/3
20 | 1/3
30 | 0/3
40 | 0/3
การขยายต่ำสุดถูกกำหนดไว้ที่ 0 การขยายสูงสุดจะถูก จำกัด ที่ขนาดพาเรนต์นั่นคือน้ำหนักถูกกำหนดไว้ที่ 0
หากองค์ประกอบถูกตั้งค่าเป็นwrap_content
ส่วนขยายของมันจะถูกคำนวณก่อนและส่วนที่เหลือจะขึ้นอยู่กับการกระจายระหว่างfill_parent
องค์ประกอบ หากweightSum
มีการตั้งค่าสิ่งนี้จะทำให้layout_weight
ไม่มีผลกระทบต่อwrap_content
องค์ประกอบ อย่างไรก็ตามwrap_content
องค์ประกอบยังสามารถผลักออกจากพื้นที่ที่มองเห็นได้โดยองค์ประกอบที่มีน้ำหนักต่ำกว่า(เช่นระหว่าง 0-1 สำหรับweightSum
= 1 หรือระหว่าง 0-20 สำหรับตัวอย่างข้างต้น)
หากไม่weightSum
ได้ระบุจะถูกคำนวณเป็นผลรวมของlayout_weight
ค่าทั้งหมดรวมถึงองค์ประกอบที่มีการwrap_content
ตั้งค่า! ดังนั้นเมื่อมีการlayout_weight
กำหนดwrap_content
องค์ประกอบสามารถมีอิทธิพลต่อการขยายตัวของพวกเขา เช่นน้ำหนักเชิงลบจะหดfill_parent
องค์ประกอบอื่น ๆ ก่อนที่fill_parent
จะมีการจัดวางองค์ประกอบสูตรข้างต้นจะถูกนำไปใช้กับwrap_content
องค์ประกอบโดยมีการขยายตัวสูงสุดที่เป็นไปได้คือการขยายตามองค์ประกอบที่ห่อ wrap_content
องค์ประกอบจะหดและหลังจากนั้นการขยายตัวเป็นไปได้สูงสุดสำหรับส่วนที่เหลือfill_parent
องค์ประกอบคือการคำนวณและจัดจำหน่าย
สิ่งนี้สามารถนำไปสู่ผลลัพธ์ที่ไม่เข้าใจง่าย
หากไม่ได้ระบุผลรวมจะถูกคำนวณโดยการเพิ่ม layout_weight ของลูกทั้งหมด สิ่งนี้สามารถนำมาใช้เพื่อให้ลูกคนเดียว 50% ของพื้นที่ว่างทั้งหมดโดยให้ layout_weight 0.5 และตั้งค่า weightSum เป็น 1.0 ต้องเป็นค่าเลขทศนิยมเช่น "1.2"
<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>
สิ่งหนึ่งที่ดูเหมือนไม่มีใครพูดถึง: สมมติว่าคุณมีแนวดิ่ง LinearLayout
ดังนั้นเพื่อให้น้ำหนักในเลย์เอาต์ / อิลิเมนต์ / มุมมองภายในเพื่อให้ทำงานได้อย่างถูกต้อง 100% - ทั้งหมดนั้นต้องมีlayout_height
คุณสมบัติ (ซึ่งต้องมีอยู่ใน xml ของคุณ) ไฟล์) 0dp
กำหนดให้ ดูเหมือนว่าค่าอื่น ๆ จะเลอะสิ่งต่าง ๆ ในบางกรณี
น้ำหนักเค้าโครงทำงานเหมือนอัตราส่วน ตัวอย่างเช่นหากมีเลย์เอาต์แนวตั้งและมีสองรายการ (เช่นปุ่มหรือ textviews) รายการหนึ่งมีน้ำหนักโครงร่าง 2 และอีกรายการมีน้ำหนักโครงร่าง 3 ตามลำดับ จากนั้นรายการที่ 1 จะครอบครอง 2 จาก 5 ส่วนของหน้าจอ / เลย์เอาต์และอีกหนึ่ง 3 จาก 5 ส่วน ที่นี่ 5 คือผลรวมน้ำหนัก ie ผลรวมน้ำหนักแบ่งเค้าโครงทั้งหมดเป็นส่วนที่กำหนดไว้ และเลย์เอาต์น้ำหนักจะกำหนดจำนวนไอเท็มเฉพาะที่ครอบครองจากผลรวมของน้ำหนักรวมที่กำหนดไว้ล่วงหน้า ผลรวมน้ำหนักสามารถประกาศด้วยตนเองเช่นกัน ปุ่ม, textviews, edittexts และอื่น ๆ ทั้งหมดได้รับการจัดระเบียบโดยใช้น้ำหนักและรูปแบบน้ำหนักเมื่อใช้รูปแบบเชิงเส้นสำหรับการออกแบบ UI
จากเอกสารของนักพัฒนา
นี้สามารถนำมาใช้สำหรับอินสแตนซ์ที่จะช่วยให้ลูกเดียว50%
ของพื้นที่ที่มีอยู่ทั้งหมดโดยให้มัน layout_weight ของ0.5
และการตั้งค่า weightSum 1.0
ไป
นอกเหนือจาก @Shubhayu คำตอบ
ส่วนที่เหลือ3/5
สามารถใช้กับเลย์เอาต์ลูกอื่น ๆ ซึ่งไม่ต้องการส่วนที่เฉพาะเจาะจงของการเก็บเลย์เอาต์
นี่คือการใช้android:weightSum
ทรัพย์สินที่มีศักยภาพ
weightSum
นี้ไม่ได้เป็นคำอธิบายวัตถุประสงค์ของ พฤติกรรมในตัวอย่างของคุณจะเหมือนกันกับการweightSum
ละเว้นและในความเป็นจริง weightSum ไม่ควรระบุในสถานการณ์นั้น เอกสารกล่าวว่าweightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.