สมมติว่าคุณต้องการใช้แท็บในแถบการทำงานเป็นรูปแบบหลักของการนำทางระดับบนสุดในแอปพลิเคชัน ขออภัย ActionBar
API พร้อมใช้งานใน Android 3.0 ขึ้นไป (API ระดับ 11 ขึ้นไป) เท่านั้น ดังนั้น หากต้องการเผยแพร่แอปพลิเคชันไปยังอุปกรณ์ที่ใช้งานแพลตฟอร์มเวอร์ชันก่อนหน้า คุณต้องจัดให้มีการติดตั้งใช้งานที่รองรับ API รุ่นใหม่กว่า ในขณะเดียวกันก็จัดเตรียมกลไกสำรองที่ใช้ API รุ่นเก่าด้วย
ในคลาสนี้ คุณจะได้สร้างคอมโพเนนต์อินเทอร์เฟซผู้ใช้ (UI) แบบแท็บ ซึ่งใช้คลาสนามธรรมที่มีการติดตั้งใช้งานเฉพาะเวอร์ชันเพื่อให้ความเข้ากันได้แบบย้อนหลัง บทเรียนนี้จะอธิบายวิธีสร้างเลเยอร์แอบสแตรกชันสำหรับ API แท็บใหม่ซึ่งเป็นขั้นตอนแรกในการสร้างคอมโพเนนต์แท็บ
เตรียมพร้อมสำหรับการทำนามธรรม
นามธรรมในภาษาโปรแกรม Java เกี่ยวข้องกับการสร้างอินเทอร์เฟซหรือคลาสนามธรรมอย่างน้อย 1 รายการเพื่อซ่อนรายละเอียดการใช้งาน ในกรณีของ API ของ Android รุ่นใหม่ คุณสามารถใช้ Abstraction เพื่อสร้างคอมโพเนนต์แบบรับรู้เวอร์ชันที่ใช้ API ปัจจุบันในอุปกรณ์รุ่นใหม่ และเปลี่ยนไปใช้ API เก่าที่เข้ากันได้มากกว่าในอุปกรณ์รุ่นเก่าได้
เมื่อใช้วิธีการนี้ คุณจะต้องพิจารณาก่อนว่าชั้นเรียนใดจะใช้คลาสใหม่แบบย้อนหลังได้ จากนั้นจึงสร้างคลาสนามธรรมโดยอิงตามอินเทอร์เฟซสาธารณะของชั้นเรียนใหม่ ในการกำหนดอินเทอร์เฟซ Abstraction คุณควรมิเรอร์ API ที่ใหม่กว่าให้ได้มากที่สุด ซึ่งจะช่วยเพิ่มความสามารถในการใช้งานร่วมกันในอนาคตให้มากที่สุด และทำให้สามารถวางเลเยอร์แอบสแตรกต์ในอนาคตเมื่อไม่จำเป็นต้องใช้งานอีกต่อไป
หลังจากสร้างคลาสนามธรรมสำหรับ API ใหม่เหล่านี้แล้ว คุณจะสร้างและเลือกการใช้งานจำนวนเท่าใดก็ได้ในระหว่างรันไทม์ สำหรับวัตถุประสงค์ด้านความเข้ากันได้แบบย้อนหลัง การติดตั้งใช้งานเหล่านี้อาจแตกต่างกันไปตามระดับ API ที่ต้องการ ดังนั้น การใช้งานอย่างหนึ่งอาจใช้ API ที่เพิ่งเผยแพร่ไป ในขณะที่การใช้งานอื่นๆ สามารถใช้ API รุ่นเก่าได้
สร้างอินเทอร์เฟซแท็บนามธรรม
ในการสร้างแท็บที่เข้ากันได้แบบย้อนหลัง ก่อนอื่น คุณควรกำหนดฟีเจอร์และ API เฉพาะที่แอปพลิเคชันต้องใช้ ในกรณีของแท็บส่วนระดับบนสุด สมมติว่าคุณมีข้อกำหนดการทำงานดังต่อไปนี้
- สัญญาณบอกสถานะแท็บควรแสดงข้อความและไอคอน
- แท็บสามารถเชื่อมโยงกับอินสแตนซ์ Fragment ได้
- กิจกรรมควรรับรู้การเปลี่ยนแปลงแท็บได้
การเตรียมข้อกำหนดเหล่านี้ไว้ล่วงหน้าจะช่วยให้คุณควบคุมขอบเขตของเลเยอร์แอบสแตรกได้ ซึ่งหมายความว่าคุณจะใช้เวลาน้อยลงในการสร้างการติดตั้งใช้งานเลเยอร์ Abstraction หลายๆ แบบ และเริ่มใช้การติดตั้งใช้งานใหม่ที่เข้ากันได้แบบย้อนหลังได้เร็วขึ้น
API ที่สำคัญสำหรับแท็บอยู่ใน ActionBar
และ ActionBar.Tab
API เหล่านี้คือ API ที่จะนำมาใช้เพื่อให้แท็บมีการรับรู้เวอร์ชัน ข้อกำหนดสำหรับโปรเจ็กต์ตัวอย่างนี้เรียกใช้ความเข้ากันได้กับ Eclair (API ระดับ 5) ขณะที่ใช้ประโยชน์จากฟีเจอร์แท็บใหม่ใน Honeycomb (API ระดับ 11) แผนภาพของโครงสร้างคลาสที่จะสนับสนุนการติดตั้งใช้งานทั้ง 2 รายการนี้ และคลาสพื้นฐาน (หรืออินเทอร์เฟซ) เชิงนามธรรมแสดงอยู่ด้านล่าง
![แผนภาพคลาสของคลาสฐานแบบนามธรรมและการใช้งานเฉพาะเวอร์ชัน](https://developer.android.google.cn/static/images/training/backward-compatible-ui-classes.png?authuser=7&hl=th)
รูปที่ 1 แผนภาพคลาสของคลาสฐานแบบนามธรรมและการใช้งานเฉพาะเวอร์ชัน
ActionBar.Tab ที่เป็นนามธรรม
เริ่มต้นสร้างเลเยอร์นามธรรมของแท็บโดยสร้างคลาสนามธรรมที่แสดงถึงแท็บซึ่งสอดคล้องกับอินเทอร์เฟซของ ActionBar.Tab
ดังนี้
Kotlin
sealed class CompatTab(val tag: String) { ... abstract fun getText(): CharSequence abstract fun getIcon(): Drawable abstract fun getCallback(): CompatTabListener abstract fun getFragment(): Fragment abstract fun setText(text: String): CompatTab abstract fun setIcon(icon: Drawable): CompatTab abstract fun setCallback(callback: CompatTabListener): CompatTab abstract fun setFragment(fragment: Fragment): CompatTab ... }
Java
public abstract class CompatTab { ... public abstract CompatTab setText(int resId); public abstract CompatTab setIcon(int resId); public abstract CompatTab setTabListener( CompatTabListener callback); public abstract CompatTab setFragment(Fragment fragment); public abstract CharSequence getText(); public abstract Drawable getIcon(); public abstract CompatTabListener getCallback(); public abstract Fragment getFragment(); ... }
คุณสามารถใช้คลาสนามธรรมแทนอินเทอร์เฟซได้ที่นี่เพื่อลดความซับซ้อนในการใช้งานฟีเจอร์ทั่วไป เช่น การเชื่อมโยงออบเจ็กต์แท็บกับกิจกรรม (ไม่ได้แสดงในข้อมูลโค้ด)
วิธีการในแท็บ ActionBar แบบแอบสแตรก
ถัดไป ให้กำหนดคลาสนามธรรมที่ให้คุณสร้างและเพิ่มแท็บไปยังกิจกรรมได้ เช่น ActionBar.newTab()
และ ActionBar.addTab()
Kotlin
sealed class TabHelper(protected val activity: FragmentActivity) { ... abstract fun setUp() fun newTab(tag: String): CompatTab { // This method is implemented in a later lesson. } abstract fun addTab(tab: CompatTab) ... }
Java
public abstract class TabHelper { ... public CompatTab newTab(String tag) { // This method is implemented in a later lesson. } public abstract void addTab(CompatTab tab); ... }
ในบทเรียนถัดไป คุณสร้างการติดตั้งใช้งานสำหรับ TabHelper
และ CompatTab
ที่ใช้ได้กับแพลตฟอร์มทั้งเวอร์ชันเก่าและเวอร์ชันใหม่