เพราะว่าเจ้า Properties ตัวนี้มีความสำคัญค่อนข้างมากในเวลาที่ออกแบบหน้าตาแอปพลิเคชันหรือตอนที่จัด Layout นั่นเอง
สำหรับคุณสมบัติ layout_weight จะมีใน View และ Layout เกือบทุกตัว โดยที่การใช้งานคุณสมบัติ layout_weight จะมีไว้ใช้กับ View หรือ Layout ที่วางอยู่ภายใน Linear Layout เท่านั้น ถ้าใช้ Layout อื่นๆเช่น Relative Layout พวก View ที่อยู่ข้างในก็จะไม่มี Properties ตัวนี้ให้กำหนด
ดังนั้นก็ขึ้นอยู่กับแต่ละงานของผู้ที่หลงเข้ามาอ่านว่ามีความจำเป็นต้องใช้ Linear Layout หรือป่าว เพราะบางที Relative Layout ก็เหมาะกับการบางงานมากกว่า และบางงานการใช้ Linear Layout ก็อาจจะเหมาะกว่า
ทีนี้ขออธิบายเจ้าคุณสมบัติ layout_weight กันต่อเลย ซึ่งคุณสมบัตินี้มีไว้กำหนดขนาดของ View หรือ Layout ให้มีอัตราส่วนแน่นอน โดยอัตราส่วนที่ว่าจะมีผลเฉพาะ View หรือ Layout ที่กำหนดค่า layout_weight เท่านั้น จะไม่มีการคิดอัตราส่วนจากตัวที่ไม่ได้กำหนดค่า layout_weight
เพิ่มเติม - สำหรับทิศทางของ Weight จะขึ้นอยู่กับ Linear Layout ว่ามี Orientation ไปในทิศทางใด ถ้าเป็น Horizontal จะกำหนดเป็นค่าความกว้าง (Width) และถ้าเป็น Vertical ก็กำหนดเป็นค่าความสูง (Height) แทน
สำหรับคุณสมบัติ layout_weight จะมีใน View และ Layout เกือบทุกตัว โดยที่การใช้งานคุณสมบัติ layout_weight จะมีไว้ใช้กับ View หรือ Layout ที่วางอยู่ภายใน Linear Layout เท่านั้น ถ้าใช้ Layout อื่นๆเช่น Relative Layout พวก View ที่อยู่ข้างในก็จะไม่มี Properties ตัวนี้ให้กำหนด
ดังนั้นก็ขึ้นอยู่กับแต่ละงานของผู้ที่หลงเข้ามาอ่านว่ามีความจำเป็นต้องใช้ Linear Layout หรือป่าว เพราะบางที Relative Layout ก็เหมาะกับการบางงานมากกว่า และบางงานการใช้ Linear Layout ก็อาจจะเหมาะกว่า
เพิ่มเติม - สำหรับทิศทางของ Weight จะขึ้นอยู่กับ Linear Layout ว่ามี Orientation ไปในทิศทางใด ถ้าเป็น Horizontal จะกำหนดเป็นค่าความกว้าง (Width) และถ้าเป็น Vertical ก็กำหนดเป็นค่าความสูง (Height) แทน
การคิดอัตราส่วนง่ายๆเลย สมมติว่าเจ้าของบล็อกสร้าง Edit Text ขึ้นมา แล้วก็ทำการกำหนดให้ layout_width เป็น 0dp ก่อน เพื่อไม่ให้ค่าช่องนี้มารบกวน แล้วกำหนดให้ layout_weight มีค่าเท่ากับ 1 ก็จะเห็นว่า Edit Text ขยายสุดขอบ
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9443f"
android:gravity="center" >
<requestFocus />
<EditText
android:id="@+id/editText1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="1" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9443f"
android:gravity="center" >
<requestFocus />
<EditText
android:id="@+id/editText1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="1" />
<EditText
android:id="@+id/editText2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="2" />
</LinearLayout>
ตามด้วยตัวอย่างต่อไปเลย!
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9443f"
android:gravity="center" >
<requestFocus />
<EditText
android:id="@+id/editText1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:hint="1" />
<EditText
android:id="@+id/editText2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="2" />
</LinearLayout>
อ๊ะ อ๊ะ!! เริ่มเข้าใจขึ้นมาบ้างแล้วละสิ ต่อเลยละกัน
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9443f"
android:gravity="center"
android:orientation="horizontal" >
<requestFocus />
<EditText
android:id="@+id/editText1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="1" />
<EditText
android:id="@+id/editText2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="2" />
<EditText
android:id="@+id/editText3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:hint="3" />
</LinearLayout>
ทีนี้เจ้าของบล็อกสร้างขึ้นมาสามอันเลย โดยเบอร์ 1, 2 และ 3 มีค่า Weight เท่ากับ 1, 2 และ 3 ตามละดับ ก็จะเห็นว่า Weight รวมเป็น 6 โดยเบอร์หนึ่งมีขนาด 1 : 6 ส่วนเบอร์สองมีขนาด 2 : 6 และเบอร์สามมีขนาด 3 : 6
ถึงตอนนี้แล้ว ผู้ที่หลงเข้ามาอ่านก็คงเข้าใจการใช้ layout_weight แล้วละมั้ง
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9443f"
android:gravity="center"
android:orientation="vertical" >
<Button
android:id="@+id/editText1"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_weight="1"
android:hint="1" />
<Button
android:id="@+id/editText2"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_weight="7"
android:hint="2" />
<Button
android:id="@+id/editText3"
android:layout_width="50dp"
android:layout_height="0dp"
android:layout_weight="1"
android:hint="3" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9443f"
android:orientation="horizontal" >
<Button
android:id="@+id/editText1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:hint="1" />
<Button
android:id="@+id/editText2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5"
android:hint="2" />
</LinearLayout>
กรณีนี้จะเห็นว่าเจ้าของบล็อกกหนดความสูงให้เป็น match_parent เพื่อจำลองการแบ่งช่องบนหน้าจอแสดงผล โดยสมมติว่าช่องซ้ายมือเป็นช่องสำหรับเมนูตัวเลือกต่างๆ และช่องขวามือเป็นหน้าหลัก
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9443f"
android:gravity="bottom" >
<requestFocus />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<EditText
android:id="@+id/editText1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<EditText
android:id="@+id/editText2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="2" />
</LinearLayout>
ขอฝากทิ้งท้ายก่อนจะจบบทความละกันว่าทำไมเจ้าของบล็อกถึงกำหนดขนาดของด้านที่จะใช้ร่วมกับ layout_weight เป็น 0dp เช่น Vertical จะใช้ layout_height เป็น 0dp เป็นต้น ทำไมถึงไม่ใช่เป็น match_parent ซะเลยล่ะ?
ภาพข้างบนนี้จะเห็นว่าถ้ากำหนดเป็น 0dp ขนาดก็จะเป็นไปตามที่ได้อธิบายไว้ แต่ทว่าพอกำหนดเป็น match_parent กลับกลายเป็นว่าอัตราส่วนของขนาดสลับกันซะงั้น กลายเป็นว่า 2 มีขนาดใหญ่กว่า และ 3 มีขนาดเล็กกว่า ดังนั้นเพื่อไม่ให้สับสนจังแนะนำให้ใช้เป็น 0dp แทนจะดีกว่า (เพราะถ้าใช้ match_parent ในโค๊ดก็จะมีการแจ้งเตือนอยู่ดีว่าแนะนำให้ใช้ 0dp แทน)