บทความ Android วันนี้ ขอนำเสนอเรื่อง การสร้าง Tab ให้กับแอพ Android ตัวอย่าง Tab ใน Android จะมีหน้าตาแบบนี้
การสร้าง Tab บน Android ทำได้ 2 วิธีคือ
สร้างโปรเจ็ค
เริ่มต้นมา ก็ให้ทำการสร้างโปรเจ็คขึ้นมาครับ
สร้าง Tab โดยใช้ TabHost
สำหรับวิธีแรก เป็นการสร้าง Tab โดยใช้ TabHost ซึ่งมันทำได้ทั้งการ extends TabActivity
ซึ่งปัจจุบันมัน deprecated
ไปแล้ว นั่นหมายถึงในอนาคตมันถูกยกเลิกไปแล้ว แต่ว่าปัจจุบันยังใช้ได้อยู่ แค่ไม่นิยม และไม่แนะนำ ให้ใช้ และการทำ TabHost โดยไม่ใช้ TabActivity
TabHost เป็นเลเอาท์ชนิดหนึ่ง ที่ภายในจะมี TabWidget ไว้แสดงชื่อของแท็ป และอีกส่วนคือ FrameLayout เอาไว้เป็นส่วนแสดงข้อมูล
ตัวอย่างโครงสร้างของ TabHost เมื่ออยู่ในรูป xml โดยแก้ไขไฟล์ activity_my.xml
เป็นดังนี้ ( ตัว TabHost จะประกาศ id เป็นชื่อเราเอง ส่วน TabWidget และ FrameLayout จะใช้ id ของทาง Android นั่นก็คือ @android:id/tabs
และ @android:id/tabcontent
)
จากนั้นเปิดไฟล์ MyActivity
ขึ้นมา ในส่วนของ onCreate()
จะเป็นดังนี้
ด้านบนเป็นการ เชื่อม TabHost ที่ประกาศไว้ใน Layout xml จากนั้นก็สร้าง TabHost โดยหลักการ และขั้นตอนการสร้าง TabHost มีดังนี้
- สร้างออปเจ็ค
TabHost
ขึ้นมา โดยใช้ TabHost ที่ประกาศไว้ใน xml และทำการเรียก .setup()
- สร้าง
TabSpec
ขึ้นมา ภายใน TabSpec
ประกอบไปด้วย
2.1 newTabSpec()
: เป็นเหมือนการกำหนดชื่อ tag
2.2 setIndicator()
: ใส่ชื่อ Title ที่เราต้องการให้มันโชว์ในส่วนแท็ป
2.3 setContent()
: เลือก Content เป็น Activity ที่เราต้องการ
- เพิ่ม
TabSpec
เข้าไปใน TabHost
ด้วยคำสั่ง addTab()
่ต่อมาเรายังไม่มี Activity ที่ชื่อ Tab1
, Tab2
และ Tab3
ก็ทำการสร้างขึ้นมาครับ โดยทั้งสามตัวใช้ไฟล์ layout ร่วมกัน ต้องการให้แค่เปลี่ยนสี background เท่านั้น
ไฟล์ tab.xml
ไฟล์ Tab1.java
ไฟล์ Tab2.java
ไฟล์ Tab3.java
ทำการแก้ไขไฟล์ AndroidManifest.xml
ด้วย เนื่องจากเราทำการเพิ่ม Activity เข้าไป
ทดสอบรันโปรแกรมดู ซักหน่อย…
ปรากฎว่ามี error
เนื่องจากว่าตัว TabHost มันจำเป็นต้องใช้ ActivityGroup
ด้วย ซึ่งจริงๆถ้าเราใช้ TabActivity
มันจะไม่มีปัญหาอะไร เพราะว่า TabActivity
มันก็ extends มาจาก ActivityGroup
อีกทีนึง
แต่เมื่อไม่มี ActivityGroup
เราก็แก้ปัญหาด้วยการใช้ LocalActivityManager
เข้ามาช่วยครับ โดยการประกาศตัวแปรเป็น global จากนั้นก็ส่งตัวแปรใช้ tabHost.setUp()
ดังนี้
จากนั้นเพิ่มเมธอด onResume()
และ onPause()
สุดท้ายไฟล์จะได้ดังนี้
ทดสอบรันโปรแกรมอีกครั้ง
ทีนี้ถ้าอยากแก้ไขข้อมูลแต่ละ Tab ก็ไปจัดการหน้า Tab1, Tab2, Tab3 เหมือนเป็นหน้า Activity อีกหน้าได้เลย
สร้าง Tab โดยใช้ ActionBar
การสร้าง Tab โดยใช้ ActionBar นั้นเป็นวิธีดีกว่า TabHost เนื่องจากว่ามันทันสมัยกว่า เป็นปัจจุบันกว่า รวมถึงง่ายกว่าด้วย
ขั้นตอนการสร้าง Tab จาก ActionBar นั้น มีขั้นตอนดังนี้
- สร้าง
ActionBar
ขึ้นมา จากนั้นก็สั่งให้เป็นโหมด Tab
- สร้าง
ActionBar.Tab
ขึ้นมา โดยใช้ ActionBar.newTab()
และต้องทำการกำหนด TabListener
ให้กับ Tab ทุกอันด้วย
- เพิ่ม Tab เข้าไปใน
ActionBar
ด้วย ActionBar.addTab()
เมื่อมีขั้นตอนการสร้างแล้ว ฉะนั้นก็มาเริ่มต้นเลย เริ่มจาก สร้างคลาสใหม่ ขึ้นมาคลาสนึงชื่อว่า ActionBarTabActivity.java
มีโค๊ดดังนี้
ด้านบนเป็นการกำหนดให้ ActionBar อยู่ในโหมด Tab ภาพด้านล่างเปรียบเทียบว่า Tab กับไม่มี Tab แตกต่างกันอย่างไร
ต่อมาก็ทำการสร้าง ActionBar โดยทำตามขั้นตอนที่กล่าวไว้ด้านบน จะได้โค๊ดดังนี้
ทดสอบรันโปรแกรม
เราก็จะได้ตัว Tab ขึ้นมาแล้ว ต่อไป ก็จะเป็นการใส่ content ให้กับ Tab แต่ละหน้า การใส่คอนเท้น เราจะใช้ Fragment เพื่อเอาไว้แสดงข้อมูล และใช้การ implement ActionBar.TabListener
สร้างคลาส MyFragment
ขึ้นมา เป็น inner class ไปเลยครับ ดังนี้
ด้านบนเป็นการสร้าง Fragment
ขึ้นมา เพื่อจะเอาไว้แสดงเนื้อหา ซึ่งตัวเนื้อหา เป็นเพียงแค่ การเปลี่ยนสีพื้นหลังเฉยๆ โดยรับ argument เป็นโค๊ดสี ที่เมธอด onCreate
และ onCreateView()
ก็นำค่าที่ได้ มาแสดงเป็นพื้นหลัง
ต่อมาก็ทำการ implements ActionBar.TabListener
โดยมี 3 เมธอด ดังนี้
ส่วนที่เราต้องการคือ เมื่อไหร่ที่ทำการกด Tab ก็จะให้แสดงเนื้อหาขึ้นมา ฉะนั้น เราก็จะทำในเมธอด onTabSelected()
แล้วก็ทำการสร้าง Fragment ขึ้นภายใน Listener นี้ดังนี้
ด้านบนก็เป็นการสร้าง Fragment โดยการส่ง argument เป็นค่าสีไปด้วย คำสั่ง setArguments()
ค่านี้ จะสามารถเข้าถึงด้วย getArguments().getString()
ในคลาส Fragment สุดท้ายลองรันโปรแกรม จะได้ผลลัพธ์ดังนี้
อีกบทความนึง ที่พูดถึงการทำ ActionBar Tab ร่วมกับ ViewPager ครับ อ่านได้ที่นี่ สอนการใช้งาน ViewPager
สรุป
ถึงแม้ว่าการสร้าง Tab บน Android จะสามารถสร้างได้หลายวิธี แต่วิธีปัจจุบันที่ดีที่สุด ควรจะใช้ ActionBar.Tab
มากกว่า เนื่องจากมันถูกออกแบบมาให้ใช้ร่วมกับ Fragment
และ FragmentManager
ส่วนการทำ TabHost หรือใช้ TabActivity มันก็สร้างได้เหมือนกัน แต่ว่ามันถูก deprecated ตั้งแต่ API 13 แล้ว ฉะนั้นเลี่ยงได้ก็เลียง ไม่ต้องใช้ครับ เพราะมันการันตีแน่นอน ว่าอนาคต มันจะถูกยกเลิกถาวร จะได้ไม่ต้องมานั่งแก้ไขบ่อยๆ เพื่อให้มองเห็นภาพรวมสั้นๆง่ายๆคือ
- ActionBar.Tab : เป็นรูปแบบใหม่ ใช้ Fragment
- TabHost : เป็นรูปแบบเก่า ใช้ Activity
สุดท้าย Source Code อยู่ที่ Github