เวลาเราพูดถึงกำหนดค่า Margin และ Padding ใน Layout Resource บนแอนดรอยด์ ก็จะนึกถึง Keyword อย่าง Top, Bottom, Start และ End กัน เพราะเป็นการกำหนด Direction ของค่า Margin หรือ Padding ที่จะมีผลต่อ UI ของแอปนั่นเอง
หมายเหตุ - ทางแอนดรอยด์แนะนำให้ใช้ Start กับ End แทน Left กับ Right เพื่อให้รองรับการแสดงผลทั้งแบบ Right-to-left และ Left-to-right
การกำหนดค่า Margin และ Padding ใน Layout Resource
โดยปกติแล้วการกำหนดค่า Margin หรือ Padding จะมีอยู่ 2 รูปแบบด้วยกัน นั่นก็คือการกำหนดค่าทั้ง 4 ด้านพร้อมกันใน Attribute เพียงตัวเดียว
android:layout_margin
android:padding
และอีกแบบคือการกำหนดค่าแยกกันสำหรับแต่ละด้าน
android:layout_marginTop
android:layout_marginBottom
android:layout_marginStart
android:layout_marginEnd
android:paddingTop
android:paddingBottom
android:paddingStart
android:paddingEnd
ถ้าอยากกำหนดค่าให้กับ 2 ด้านที่อยู่ตรงข้ามกันด้วยค่าเดียวกันล่ะ?
ถึงแม้ว่าการกำหนดค่าทั้ง 2 รูปแบบจะครอบคลุมกับการใช้งานอยู่แล้ว แต่นักพัฒนาส่วนใหญ่ก็จะพบว่าต้องกำหนดค่าระหว่าง Top กับ Bottom หรือ Start กับ End ที่เป็นด้านตรงข้ามด้วยค่าเดียวกันอยู่บ่อยๆ ยกตัวอย่างเช่น
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
จึงทำให้แอนดรอยด์ได้เพิ่ม Attribute ขึ้นมาอีก 2 แบบเพื่อแก้ปัญหานี้ นั่นก็คือ Vertical (Top + Bottom) และ Horizontal (Start + End)
android:layout_marginVertical
android:layout_marginHorizontal
android:paddingVertical
android:paddingHorizontal
แต่เรื่องมันเศร้าตรงที่ว่า Attribute เหล่านี้ถูกเพิ่มเข้ามาใน Android 8.0 Oreo (API Level 26) จึงใช้งานกับเวอร์ชันที่ต่ำกว่านั้นไม่ได้
อยากใช้หรอ? ไม่ต้องห่วง เดี๋ยว AAPT2 จัดการให้
จะให้รอจนกว่า Minimum SDK Version เป็น API Level 26 ก็คงต้องรอกันอีกหลายปี จึงทำให้ Android Asset Packaging Tool V2 ซึ่งเป็นหนึ่งใน Tools ที่จะทำงานตอน Build Time ได้เพิ่มความสามารถเข้ามาในเวอร์ชัน 2.16
โดย AAPT2 จะทำการ Downgrade โดยแปลง Attribute ที่เพิ่มเข้ามาใน API Level 26 เพื่อให้รองรับกับเวอร์ชันที่ต่ำกว่านั่นเอง ยกตัวอย่างเช่น
android:layout_marginHorizontal
จะถูกแปลงเป็นandroid:layout_marginLeft
กับandroid:layout_marginRight
android:paddingVertical
จะถูกแปลงเป็นandroid:paddingTop
กับandroid:paddingBottom
อ่าว ทำไมถึงเป็น Left กับ Right แทนที่จะใช้เป็น Start กับ End ล่ะ...
และเมื่อขั้นตอนดังกล่าวเกิดขึ้นตอน Build Time จึงทำให้นักพัฒนาไม่ต้องทำอะไรเพิ่มเติมเป็นพิเศษ สามารถกำหนดค่า Attribute เหล่านั้นใน Layout Resource ได้ตามปกติเลย
จะรู้ได้ยังไงว่าใช้ AAPT2 เวอร์ชันไหนอยู่ ?
โดยปกติ AAPT2 จะอยู่ใน Build Tools ของ Android SDK ซึ่งจะถูกดาวน์โหลดมาจาก Google Maven Repository และ Build Tools ที่ใช้งานกันอยู่ในทุกวันนี้ ก็จะใช้ AAPT2 เป็นเวอร์ชัน 2.19 อยู่แล้ว ดังนั้นไม่จำเป็นต้องเช็คเวอร์ชัน AAPT2 เลย สามารถใช้งานได้อย่างสบายใจเลยจ้า
ต้องขอบคุณที่ Google Play มีนโยบายบังคับให้นักพัฒนาต้องอัปเดต Target API Level อยู่เสมอ จึงทำให้ Build Tools ถูกอัปเดตตามไปด้วยฃ
สรุป
นักพัฒนาสามารถกำหนดค่า Margin หรือ Padding ด้วยการกำหนดค่าแบบ Vertical หรือ Horizontal ได้เลย ไม่ต้องแยกเป็น 2 Attribute ให้ยุ่งยากอีกต่อไป เพราะเดี๋ยว AAPT2 ก็จะทำการ Downgrade ให้เป็น Attribute แบบเก่าตอน Build Time นั่นเอง