เวลาเราพูดถึงกำหนดค่า Margin และ Padding ใน Layout Resource บนแอนดรอยด์ ก็จะนึกถึง Keyword อย่าง Top, Bottom, Start และ End กัน เพราะเป็นการกำหนด Direction ของค่า Margin หรือ Padding ที่จะมีผลต่อ UI ของแอปนั่นเอง

หมายเหตุ - ทางแอนดรอยด์แนะนำให้ใช้ Start กับ End แทน Left กับ Right เพื่อให้รองรับการแสดงผลทั้งแบบ Right-to-left และ Left-to-right

เลิกใช้ Left/Right และเปลี่ยนมาใช้ Start/End ใน UI Layout ได้แล้วนะ
การสร้าง UI Layout ของแอนดรอยด์จะขาด Margin, Padding หรือ Gravity ไปไม่ได้อย่างแน่นอน และนักพัฒนาก็จะคุ้นเคยกันดีกับการอ้างอิงตำแหน่งในรูปแบบของ Top, Bottom, Left และ Right แต่หารู้ไม่ว่าในปัจจุบันนี้แอนดรอยด์ได้เปลี่ยนมาใช้เป็น Top, Bottom, Start และ End แทนแล้วนะ

การกำหนดค่า 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 นั่นเอง