พร็อกซีสำหรับ API ใหม่

บทเรียนนี้จะแสดงวิธีสร้างคลาสย่อยของคลาสนามธรรม CompatTab และ TabHelper และใช้ API ใหม่ แอปพลิเคชันของคุณสามารถใช้การติดตั้งนี้บนอุปกรณ์ที่ใช้เวอร์ชันแพลตฟอร์มที่รองรับการใช้งาน

ใช้แท็บโดยใช้ API ใหม่

คลาสที่เฉพาะเจาะจงสําหรับ CompatTab และ TabHelper ที่ใช้ API เวอร์ชันใหม่เป็นการนํา Proxy ไปใช้ เนื่องจากคลาสนามธรรมที่กำหนดไว้ในบทเรียนก่อนหน้าจะมิเรอร์ API ใหม่ (โครงสร้างคลาส ลายเซ็นเมธอด ฯลฯ) คลาสที่เป็นรูปธรรมที่ใช้ API รุ่นใหม่เหล่านี้เพียงแค่เรียกเมธอดพร็อกซีและผลลัพธ์

คุณสามารถใช้ API รุ่นใหม่กว่าในชั้นเรียนที่เป็นรูปธรรมเหล่านี้ได้โดยตรงและไม่เกิดข้อขัดข้องในอุปกรณ์รุ่นเก่า เนื่องจากการโหลดคลาสแบบ Lazy Loading ระบบจะโหลดและเริ่มต้นชั้นเรียนเมื่อเข้าถึงครั้งแรก ซึ่งเป็นการยืนยันคลาสหรือการเข้าถึงช่องหรือเมธอดแบบคงที่เป็นครั้งแรก ดังนั้น ตราบใดที่คุณไม่ได้สร้างอินสแตนซ์การใช้งานเฉพาะ Honeycomb ในอุปกรณ์รุ่นก่อน Honeycomb อยู่ VM ของ Dalvik จะไม่แสดงข้อยกเว้น VerifyError

รูปแบบการตั้งชื่อที่ดีสำหรับการใช้งานนี้คือการเพิ่มชื่อรหัสระดับ API หรือเวอร์ชันแพลตฟอร์มต่อท้ายชื่อ API ที่คลาสที่เฉพาะเจาะจงต้องการ ตัวอย่างเช่น คลาส CompatTabHoneycomb และ TabHelperHoneycomb สามารถให้บริการแท็บเนทีฟได้ เนื่องจากคลาสเหล่านี้ใช้ API ที่มีใน Android 3.0 (API ระดับ 11) ขึ้นไป

แผนภาพชั้นเรียนสำหรับการใช้งานแท็บ Honeycomb

รูปที่ 1 แผนภาพคลาสสําหรับการติดตั้งใช้งานแท็บ Honeycomb

ใช้ CompatTabHoneycomb

CompatTabHoneycomb คือการใช้งานคลาสนามธรรม CompatTab ที่ TabHelperHoneycomb ใช้อ้างอิงแท็บแต่ละแท็บ CompatTabHoneycomb เพียงพร็อกซีการเรียกเมธอดทั้งหมดไปยังออบเจ็กต์ ActionBar.Tab ที่มีอยู่

เริ่มใช้ CompatTabHoneycomb โดยใช้ ActionBar.Tab API ใหม่:

KotlinJava
class CompatTabHoneycomb internal constructor(val activity: Activity, tag: String) :
       
CompatTab(tag) {
   
...
   
// The native tab object that this CompatTab acts as a proxy for.
   
private var mTab: ActionBar.Tab =
           
// Proxy to new ActionBar.newTab API
            activity
.actionBar.newTab()

   
override fun setText(@StringRes textId: Int): CompatTab {
       
// Proxy to new ActionBar.Tab.setText API
        mTab
.setText(textId)
       
return this
   
}

   
...
   
// Do the same for other properties (icon, callback, etc.)
}
public class CompatTabHoneycomb extends CompatTab {
   
// The native tab object that this CompatTab acts as a proxy for.
   
ActionBar.Tab mTab;
   
...

   
protected CompatTabHoneycomb(FragmentActivity activity, String tag) {
       
...
       
// Proxy to new ActionBar.newTab API
        mTab
= activity.getActionBar().newTab();
   
}

   
public CompatTab setText(int resId) {
       
// Proxy to new ActionBar.Tab.setText API
        mTab
.setText(resId);
       
return this;
   
}

   
...
   
// Do the same for other properties (icon, callback, etc.)
}

ติดตั้งใช้งาน TabHelperHoneycomb

TabHelperHoneycomb คือการใช้งานคลาสนามธรรม TabHelper ที่ทำหน้าที่เป็นพร็อกซีการเรียกเมธอดไปยัง ActionBar จริง ซึ่งได้จาก Activity ที่มี

ใช้ TabHelperHoneycomb การเรียกเมธอดพร็อกซีไปยัง ActionBar API:

KotlinJava
class TabHelperHoneycomb internal constructor(activity: FragmentActivity) : TabHelper(activity) {

   
private var mActionBar: ActionBar? = null

   
override fun setUp() {
        mActionBar
= mActionBar ?: mActivity.actionBar.apply {
            navigationMode
= ActionBar.NAVIGATION_MODE_TABS
       
}
   
}

   
override fun addTab(tab: CompatTab) {
       
// Tab is a CompatTabHoneycomb instance, so its
       
// native tab object is an ActionBar.Tab.
        mActionBar
?.addTab(tab.getTab() as ActionBar.Tab)
   
}
}
public class TabHelperHoneycomb extends TabHelper {
   
ActionBar actionBar;
   
...

   
protected void setUp() {
       
if (actionBar == null) {
            actionBar
= activity.getActionBar();
            actionBar
.setNavigationMode(
                   
ActionBar.NAVIGATION_MODE_TABS);
       
}
   
}

   
public void addTab(CompatTab tab) {
       
...
       
// Tab is a CompatTabHoneycomb instance, so its
       
// native tab object is an ActionBar.Tab.
        actionBar
.addTab((ActionBar.Tab) tab.getTab());
   
}

   
// The other important method, newTab() is part of
   
// the base implementation.
}

คุณควรอ่าน