ฉันไม่เข้าใจวิธีการใช้คุณสมบัตินี้ ใครสามารถบอกฉันเพิ่มเติมเกี่ยวกับเรื่องนี้ได้บ้าง
ฉันไม่เข้าใจวิธีการใช้คุณสมบัตินี้ ใครสามารถบอกฉันเพิ่มเติมเกี่ยวกับเรื่องนี้ได้บ้าง
คำตอบ:
ด้วยlayout_weight
คุณสามารถระบุอัตราส่วนขนาดระหว่างหลายมุมมอง เช่นคุณมี a MapView
และ a table
ซึ่งควรแสดงข้อมูลเพิ่มเติมบางอย่างบนแผนที่ แผนที่ควรใช้ 3/4 ของหน้าจอและตารางควรใช้ 1/4 ของหน้าจอ จากนั้นคุณจะตั้งค่าlayout_weight
ของmap
3 เป็นและlayout_weight
ของtable
1
เพื่อให้ได้งานคุณต้องตั้งความสูงหรือความกว้าง (ขึ้นอยู่กับทิศทางของคุณ) เป็น 0px
สรุปlayout_weight
ระบุจำนวนพื้นที่พิเศษในโครงร่างที่จะจัดสรรให้กับมุมมอง
LinearLayout รองรับการกำหนดน้ำหนักให้กับเด็กแต่ละคน คุณลักษณะนี้กำหนดค่า "ความสำคัญ" ให้กับมุมมองและอนุญาตให้ขยายเพื่อเติมพื้นที่ว่างที่เหลืออยู่ในมุมมองพาเรนต์ น้ำหนักเริ่มต้นของการดูคือศูนย์
โดยทั่วไปสูตรคือ:
พื้นที่ที่กำหนดให้กับเด็ก = (น้ำหนักของเด็กแต่ละคน) / (ผลรวมของน้ำหนักของเด็กทุกคนใน Linear Layout)
หากมีกล่องข้อความสามกล่องและอีกสองกล่องมีน้ำหนักเป็น 1 ในขณะที่กล่องที่สามไม่มีน้ำหนัก (0) พื้นที่ที่เหลือจะถูกกำหนดดังนี้:
กล่องข้อความที่ 1 = 1 / (1 + 1 + 0)
กล่องข้อความที่สอง = 1 / (1 + 1 + 0)
กล่องข้อความที่ 3 = 0 / (1 + 1 + 0)
สมมติว่าเรามีป้ายข้อความและองค์ประกอบแก้ไขข้อความสองรายการในแถวแนวนอน ไม่มีการlayout_weight
ระบุป้ายกำกับดังนั้นจึงใช้พื้นที่ขั้นต่ำในการแสดงผล หากlayout_weight
องค์ประกอบการแก้ไขข้อความทั้งสองรายการถูกตั้งค่าเป็น 1 ความกว้างที่เหลือในเค้าโครงหลักจะถูกแบ่งเท่า ๆ กัน (เพราะเราอ้างว่าพวกเขามีความสำคัญเท่าเทียมกัน)
คำนวณ:
ป้ายกำกับที่ 1 = 0 / (0 + 1 + 1)
กล่องข้อความที่สอง = 1 / (0 + 1 + 1)
กล่องข้อความที่ 3 = 1 / (0 + 1 + 1)
ถ้าแทนกล่องข้อความหนึ่งกล่องแรกมี a layout_weight
1 และกล่องข้อความที่สองมี a layout_weight
2 จากนั้นหนึ่งในสามของพื้นที่ว่างที่เหลือจะได้รับในช่องแรกและสองในสามเป็นที่สอง (เพราะเราอ้างสิทธิ์ที่สอง สิ่งหนึ่งสำคัญกว่า)
คำนวณ:
ป้ายกำกับที่ 1 = 0 / (0 + 1 + 2)
กล่องข้อความที่สอง = 1 / (0 + 1 + 2)
กล่องข้อความที่ 3 = 2 / (0 + 1 + 2)
android:layout_width="0px"
เป็นเรื่องสำคัญ นอกจากนี้น้ำหนักไม่จำเป็นต้องเป็นจำนวนเต็ม
weightSum
มาถ่ายภาพแล้ว? มันเกี่ยวข้องกับเรื่องlayout_weight
อะไรบ้าง?
การเพิ่มคำตอบอื่น ๆ สิ่งที่สำคัญที่สุดในการทำให้เรื่องนี้ทำงานคือการกำหนดความกว้างของเลย์เอาต์ (หรือความสูง) เป็น 0px
android:layout_width="0px"
มิฉะนั้นคุณจะเห็นขยะ
หากมีมุมมองหลายทอดLinearLayout
แล้วlayout_weight
จะช่วยให้พวกเขาในแต่ละขนาดสัดส่วน มุมมองที่มีlayout_weight
ค่า "น้ำหนัก" มากขึ้นก็จะได้พื้นที่มากขึ้น
นี่คือภาพเพื่อทำให้สิ่งต่าง ๆ ชัดเจนยิ่งขึ้น
รูปแบบน้ำหนักคำที่เกี่ยวข้องกับแนวคิดของค่าเฉลี่ยถ่วงน้ำหนักในคณิตศาสตร์ มันเหมือนอยู่ในชั้นเรียนของวิทยาลัยที่การบ้านมีค่า 30% การเข้าร่วมมีค่า 10% กลางภาคมีค่า 20% และสุดท้ายคือ 40% คะแนนของคุณสำหรับชิ้นส่วนเหล่านั้นเมื่อถ่วงน้ำหนักร่วมกันให้คะแนนรวมของคุณ
มันเหมือนกันสำหรับน้ำหนักเค้าโครง Views
ในแนวนอนLinearLayout
แต่ละคนจะสามารถใช้เวลาถึงร้อยละหนึ่งของความกว้างทั้งหมด (หรือเปอร์เซ็นต์ของความสูงสำหรับแนวตั้งLinearLayout
)
สิ่งLinearLayout
ที่คุณใช้จะมีลักษณะเช่นนี้:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- list of subviews -->
</LinearLayout>
โปรดทราบว่าคุณต้องใช้สำหรับlayout_width="match_parent"
LinearLayout
ถ้าคุณใช้wrap_content
มันจะไม่ทำงาน นอกจากนี้โปรดทราบว่าlayout_weight
ไม่สามารถใช้งานได้กับมุมมองใน RelativeLayouts (ดูที่นี่และที่นี่เพื่อหาคำตอบ SO ที่เกี่ยวข้องกับปัญหานี้)
แต่ละมุมมองในแนวนอนLinearLayout
มีลักษณะดังนี้:
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
โปรดทราบว่าคุณจำเป็นต้องใช้ร่วมกับlayout_width="0dp"
layout_weight="1"
การลืมสิ่งนี้ทำให้เกิดปัญหาผู้ใช้ใหม่มากมาย (ดูบทความนี้สำหรับผลลัพธ์ที่แตกต่างที่คุณสามารถทำได้โดยไม่ตั้งค่าความกว้างเป็น 0) หากมุมมองของคุณอยู่ในแนวตั้ง LinearLayout
คุณควรใช้layout_height="0dp"
แน่นอน
ในButton
ตัวอย่างด้านบนฉันตั้งค่าน้ำหนักเป็น 1 แต่คุณสามารถใช้ตัวเลขใดก็ได้ มันเป็นเพียงผลรวมที่สำคัญ คุณสามารถเห็นได้จากปุ่มสามแถวในภาพแรกที่ฉันโพสต์ตัวเลขต่างกันทั้งหมด แต่เนื่องจากสัดส่วนเท่ากันความกว้างถ่วงน้ำหนักจึงไม่เปลี่ยนแปลงในแต่ละแถว บางคนชอบใช้เลขทศนิยมที่มีผลรวมเป็น 1 เพื่อให้อยู่ในรูปแบบที่ซับซ้อนจะมีความชัดเจนว่าน้ำหนักของแต่ละส่วนคืออะไร
โน้ตตัวสุดท้าย หากคุณมีเลย์เอาต์ที่ซ้อนกันมากมายที่ใช้งานlayout_weight
อาจเป็นผลเสียต่อประสิทธิภาพการทำงาน
นี่คือเค้าโครง xml สำหรับภาพด้านบน:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android:layout_weight="
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<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="2"
android:text="2" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android:layout_weight="
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="10"
android:text="10" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="20"
android:text="20" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="10"
android:text="10" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android:layout_weight="
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:text=".25" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".50"
android:text=".50" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:text=".25" />
</LinearLayout>
</LinearLayout>
layout_weight
บอก Android วิธีการกระจายของคุณView
s LinearLayout
ใน Android จะคำนวณสัดส่วนทั้งหมดที่ต้องการสำหรับView
s ทั้งหมดที่มีน้ำหนักที่ระบุและวางแต่ละส่วนView
ตามสัดส่วนของหน้าจอที่ระบุไว้ ในตัวอย่างต่อไป, Android เห็นว่าTextView
s มีlayout_weight
ของ0
(นี่เป็นค่าเริ่มต้น) และEditText
s มีlayout_weight
ของ2
แต่ละคนขณะที่มีน้ำหนักของButton
1
จัดสรรดังนั้น Android 'พอเพียง' พื้นที่ในการแสดงผลtvUsername
และtvPassword
แล้วแบ่งที่เหลือของความกว้างหน้าจอออกเป็น 5 ส่วนเท่า ๆ กันสองซึ่งจะจัดสรรให้กับetUsername
สองถึงetPassword
และส่วนสุดท้ายที่จะbLogin
:
<LinearLayout android:orientation="horizontal" ...>
<TextView android:id="@+id/tvUsername"
android:text="Username"
android:layout_width="wrap_content" ... />
<EditText android:id="@+id/etUsername"
android:layout_width="0dp"
android:layout_weight="2" ... />
<TextView android:id="@+id/tvPassword"
android:text="Password"
android:layout_width="wrap_content" />
<EditText android:id="@+id/etPassword"
android:layout_width="0dp"
android:layout_weight="2" ... />
<Button android:id="@+id/bLogin"
android:layout_width="0dp"
android:layout_weight="1"
android:text="Login"... />
</LinearLayout>
ดูเหมือนว่า:
และ
คิดว่าอย่างนั้นจะง่ายกว่า
หากคุณมี 3 ปุ่มและน้ำหนักของปุ่มอยู่ที่ 1,3,1 ดังนั้นมันจะทำงานเหมือนกับตารางใน HTML
ระบุ 5 ส่วนสำหรับบรรทัดนั้น: 1 ส่วนสำหรับปุ่ม 1, 3 ส่วนสำหรับปุ่ม 2 และ 1 ส่วนสำหรับปุ่ม 1
คำนึงถึง,
หนึ่งในคำอธิบายที่ดีที่สุดสำหรับฉันคืออันนี้ (จากการกวดวิชา Android มองหาขั้นตอนที่ 7) :
layout_weight ใช้ใน LinearLayouts เพื่อกำหนด "ความสำคัญ" ให้กับมุมมองภายในเค้าโครง มุมมองทั้งหมดมีเค้าโครงเริ่มต้นน้ำหนักเป็นศูนย์หมายความว่าพื้นที่บนหน้าจอมากเท่าที่จำเป็นต้องแสดง การกำหนดค่าที่สูงกว่าศูนย์จะแยกส่วนที่เหลือของพื้นที่ว่างในมุมมองพาเรนต์ตามค่าของ layout_weight แต่ละมุมมองและอัตราส่วนต่อมุมมอง layout_weight โดยรวมที่ระบุในโครงร่างปัจจุบันสำหรับองค์ประกอบนี้และมุมมองอื่น ๆ
ในการให้ตัวอย่าง: สมมติว่าเรามีป้ายข้อความและองค์ประกอบแก้ไขข้อความสองรายการในแถวแนวนอน ป้ายกำกับไม่มีการระบุ layout_weight ดังนั้นจึงต้องใช้พื้นที่ขั้นต่ำในการแสดงผล หาก layout_weight ขององค์ประกอบการแก้ไขข้อความทั้งสองถูกตั้งค่าเป็น 1 ความกว้างที่เหลือในเค้าโครงหลักจะถูกแบ่งเท่า ๆ กัน (เพราะเราอ้างว่ามันมีความสำคัญเท่าเทียมกัน) หากอันแรกมี layout_weight 1 และที่สองมี layout_weight 2 จากนั้นหนึ่งในสามของพื้นที่ที่เหลือจะมอบให้กับที่หนึ่งและสองในสามที่สอง (เพราะเราอ้างว่าอันที่สองสำคัญกว่า)
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight กำหนดพื้นที่ที่ตัวควบคุมต้องได้รับตามลำดับไปยังตัวควบคุมอื่น
สำหรับเพิ่มเติม:
สำหรับvertical
การวางแนวอย่าลืมตั้งไว้height
ที่ 0dp
android:layout_height="0dp"
สำหรับhorizontal
การวางแนวอย่าลืมตั้งไว้width
ที่ 0dp
android:layout_width="0dp"
โปรดดู weightSum ของ LinearLayout และ layout_weight ของแต่ละมุมมอง android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" layout_height ของพวกเขามีทั้ง 0px แต่ฉันไม่แน่ใจว่าเกี่ยวข้องกันหรือไม่
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4">
<fragment android:name="com.example.SettingFragment"
android:id="@+id/settingFragment"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="2"
/>
<Button
android:id="@+id/dummy_button"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="2"
android:text="DUMMY"
/>
</LinearLayout>
รวมทั้งคำตอบจาก
Flo & rptwsthi และ roetzi
อย่าลืมที่จะเปลี่ยนของคุณlayout_width=0dp/px
มิฉะนั้นlayout_weight
พฤติกรรมจะทำหน้าที่ตรงกันข้ามโดยมีจำนวนมากที่สุดครอบครองพื้นที่ที่เล็กที่สุดและจำนวนที่น้อยที่สุดจะครอบครองพื้นที่ที่ใหญ่ที่สุด
นอกจากนี้การผสมน้ำหนักบางส่วนจะทำให้รูปแบบบางอย่างไม่สามารถแสดงได้ (เนื่องจากอยู่เหนือพื้นที่ว่าง)
ระวังสิ่งนี้
การเพิ่มandroid:autoSizeTextType="uniform"
จะปรับขนาดข้อความให้คุณโดยอัตโนมัติ
ตามชื่อที่แนะนำน้ำหนักเค้าโครงระบุจำนวนหรือเปอร์เซ็นต์ของพื้นที่ที่ฟิลด์หรือวิดเจ็ตเฉพาะควรใช้พื้นที่หน้าจอ ถ้าเราระบุน้ำหนักในแนวนอนแล้วเราจะต้องระบุ
ในทำนองเดียวกันถ้าเราระบุน้ำหนักในแนวตั้งแล้วเราจะต้องระบุ
layout_width = 0px
layout_height = 0px