แอบสแตรก API ใหม่

สมมติว่าคุณต้องการใช้แท็บแถบการดำเนินการเป็นรูปแบบหลักในการนําทางระดับบนสุดในแอปพลิเคชัน ขออภัย 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 ใดบ้าง ในกรณีของแท็บส่วนระดับบนสุด สมมติว่าคุณมีข้อกำหนดการทำงานดังต่อไปนี้

  1. ตัวบ่งชี้แท็บควรแสดงข้อความและไอคอน
  2. แท็บสามารถเชื่อมโยงกับอินสแตนซ์ Fragment ได้
  3. กิจกรรมควรฟังการเปลี่ยนแปลงแท็บได้

การเตรียมข้อกำหนดเหล่านี้ไว้ล่วงหน้าจะช่วยให้คุณควบคุมขอบเขตของเลเยอร์แอบสแตรกได้ ซึ่งหมายความว่าคุณจะใช้เวลาน้อยลงในการสร้างการติดตั้งใช้งานเลเยอร์ Abstraction หลายๆ แบบ และเริ่มใช้การติดตั้งใช้งานใหม่ที่เข้ากันได้แบบย้อนหลังได้เร็วขึ้น

API หลักสําหรับแท็บอยู่ใน ActionBar และ ActionBar.Tab ต่อไปนี้คือ API ที่จะแยกออกมาเพื่อให้แท็บรับรู้เวอร์ชัน ข้อกำหนดสำหรับโปรเจ็กต์ตัวอย่างนี้กำหนดให้ต้องเข้ากันได้กับ Eclair (API ระดับ 5) ในขณะที่ใช้ประโยชน์จากฟีเจอร์แท็บใหม่ใน Honeycomb (API ระดับ 11) แผนภาพของโครงสร้างคลาสที่จะสนับสนุนการติดตั้งใช้งานทั้ง 2 รายการนี้ และคลาสพื้นฐาน (หรืออินเทอร์เฟซ) เชิงนามธรรมแสดงไว้ที่ด้านล่าง

แผนภาพคลาสของคลาสฐานแบบนามธรรมและการใช้งานเฉพาะเวอร์ชัน

รูปที่ 1 แผนภาพคลาสของคลาสฐานแบบนามธรรมและการใช้งานเฉพาะเวอร์ชัน

ActionBar.Tab ที่เป็นนามธรรม

เริ่มต้นสร้างเลเยอร์การแยกแยะแท็บโดยสร้างคลาสนามธรรมที่แสดงถึงแท็บ ซึ่งจะแสดงอินเทอร์เฟซ ActionBar.Tab ดังนี้

KotlinJava
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
   
...
}
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()

KotlinJava
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)

   
...
}
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 ที่ใช้ได้กับแพลตฟอร์มทั้งเวอร์ชันเก่าและเวอร์ชันใหม่

คุณควรอ่าน