12/08/2018, 16:45

Tạo Material Design Tab trong ứng dụng Android

Trong bài viết này, bạn sẽ tìm hiểu cách hiển thị các tab bằng cách sử dụng TabLayout và ViewPager. Chúng ta sẽ đề cập đến những vấn đề sau: Các thành phần TabLayout và ViewPager. Các chế độ tab khác nhau: có thể cuộn và cố định. Làm thế nào để hiển thị các icon thay vì text cho các tiêu đề ...

Trong bài viết này, bạn sẽ tìm hiểu cách hiển thị các tab bằng cách sử dụng TabLayout và ViewPager. Chúng ta sẽ đề cập đến những vấn đề sau:

  • Các thành phần TabLayout và ViewPager.
  • Các chế độ tab khác nhau: có thể cuộn và cố định.
  • Làm thế nào để hiển thị các icon thay vì text cho các tiêu đề tab.

Chuẩn bị

Để có thể làm theo hướng dẫn này, bạn sẽ cần:

  • Android Studio 3.0 hoặc phiên bản cao hơn.
  • Kotlin plugin 1.1.51 hoặc phiên bản cao hơn.

Giới thiệu TabLayout

Thành phần TabLayout là một trong những thành phần thuộc material design. Hơn nữa, nó cũng nằm trong trong thư viện hỗ trợ thiết kế. Trong TabLayout, khi một tab được chọn, một trang khác (hoặc fragment) sẽ được hiển thị tới người dùng.

Thành phần TabLayout có thể có các tab được hiển thị theo một trong hai cách: cố định và cuộn. Nếu các tab được cố định, tất cả các tab sẽ được hiển thị trên màn hình cùng một lúc.

Ảnh chụp màn hình dưới đây là ứng dụng Android WhatsApp Android chính thức mới nhất (như của bài viết này), sử dụng TabLayout với chế độ cố định.

Trong các tab ở chế độ cuộn, nếu số lượng các tab trở nên quá rộng cho màn hình, người dùng có thể vuốt sang trái hoặc phải để xem nhiều tab hơn.

Dưới đây là ví dụ về TabLayout với chế độ tab cuộn - được trình bày trong phiên bản mới nhất của ứng dụng News & Weather trên Android của Google.

Hơn nữa, thông tin được hiển thị trên một tab có thể là text, icon, hoặc kết hợp giữa cả text và icon. Ví dụ: ứng dụng Twitter mới nhất dành cho Android sử dụng icon thay vì text trên mỗi tab.

Trong các phần sau, chúng ta sẽ xây dựng một ứng dụng đơn giản sử dụng TabLayout với ViewPager.

1. Tạo Android Studio Projetc

2. Tạo các Fragment

Chúng ta sẽ tạo một TabLayout với 3 tab. Khi mỗi tab được chọn, nó sẽ hiển thị Fragment tương ứng. Chúng ta sẽ bắt đầu với Fragment đầu tiên và bạn hãy làm tương tự cho hai Fragment còn lại - FragmentTwo.kt và FragmentThree.kt.

FragmentOne.kt:

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
 
class FragmentOne : Fragment() {
 
    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? =
            inflater!!.inflate(R.layout.fragment_one, container, false)
 
    companion object {
        fun newInstance(): FragmentOne = FragmentOne()
    }
}

R.layout.fragment_one

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_awidth="match_parent"
             android:layout_height="match_parent"
             android:orientation="vertical">
 
    <TextView
            android:layout_awidth="match_parent"
            android:layout_height="match_parent"
            android:text="FragmentOne"
            android:gravity="center_vertical|center_horizontal"/>
 
</LinearLayout>

3. Thêm TabLayout và ViewPager

Để sử dụng TabLayout và ViewPager, bạn phải import thự viện support trong build.gradle :

dependencies {
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.android.support:support-v4:26.1.0'
}

res/layout/activlty_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/main_content"
        android:layout_awidth="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
 
    <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_awidth="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">
 
        <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_awidth="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:contentInsetStartWithNavigation="0dp"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>
 
        <android.support.design.widget.TabLayout
                android:id="@+id/tab_layout"
                style="@style/CustomTabLayout"
                android:layout_awidth="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:layout_gravity="left"
                android:background="@color/colorPrimary"
                app:tabGravity="fill"
                app:tabMode="fixed"/>
 
    </android.support.design.widget.AppBarLayout>
 
    <android.support.v4.view.ViewPager
            android:id="@+id/view_pager"
            android:layout_awidth="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
 
</android.support.design.widget.CoordinatorLayout>

4. Tạo PagerAdapter

Chúng ta cần phải tạo ra một lớp SampleAdapter.kt kế thừa từ FragmentPagerAdapter. Lớp này có trách nhiệm quản lý các Fragment khác nhau sẽ được hiển thị trên các tab.

import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter
 
class SampleAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
 
    override fun getItem(position: Int): Fragment? = when (position) {
        0 -> FragmentOne.newInstance()
        1 -> FragmentTwo.newInstance()
        2 -> FragmentThree.newInstance()
        else -> null
    }
 
    override fun getPageTitle(position: Int): CharSequence = when (position) {
        0 -> "Tab 1 Item"
        1 -> "Tab 2 Item"
        2 -> "Tab 3 Item"
        else -> ""
    }
 
    override fun getCount(): Int = 3
}

5. Khởi tạo các thành phần

Tiếp theo, chúng ta sẽ khởi tạo các thành phần TabLayout, ViewPager và SampleAdapter. Việc này được thực hiện bên trong onCreate () trong MainActivity.kt.

import android.os.Bundle
import android.support.design.widget.TabLayout
import android.support.v4.view.ViewPager
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
 
class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        initToolbar()
 
        val tabLayout: TabLayout = findViewById(R.id.tab_layout)
 
        val viewPager: ViewPager = findViewById(R.id.view_pager)
 
        val adapter = SampleAdapter(supportFragmentManager)
 
        viewPager.adapter = adapter
        tabLayout.setupWithViewPager(viewPager)
        
        tabLayout.addTab(tabLayout.newTab().setText("TAB 1 ITEM"))
        tabLayout.addTab(tabLayout.newTab().setText("TAB 2 ITEM"))
        tabLayout.addTab(tabLayout.newTab().setText("TAB 3 ITEM"))
         
        tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
            override fun onTabSelected(tab: TabLayout.Tab) {
 
            }
 
            override fun onTabUnselected(tab: TabLayout.Tab) {
 
            }
 
            override fun onTabReselected(tab: TabLayout.Tab) {
 
            }
        })
    }
 
    private fun initToolbar() {
        val toolbar: Toolbar = findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)
        supportActionBar!!.title = "TabLayout Demo"
    }
}

6. Test ứng dụng

Cuối cùng, bạn hãy chạy app kết quả như sau :

0