Implementing ViewPager and TabLayout in Android Application

Introduction

In modern Android development, using ViewPager and TabLayout together is a common way to create swipeable views with tabs. This combination benefits applications that require smooth navigation through different fragments or views, like social media apps, news readers, and more. This blog will guide you through the process of integrating ViewPager and TabLayout I am using Kotlin in an Android application.

Prerequisites

Before we start, ensure you have the following set up:

  • Android Studio installed
  • Basic knowledge of Kotlin and Android development
  • A new Android project created

Step 1: Setting Up Dependencies

First, ensure you have the necessary dependencies in your build.gradle file. Add the following dependencies if they are not already included:

dependencies {
    implementation "androidx.core:core-ktx:1.7.0"
    implementation "androidx.appcompat:appcompat:1.4.0"
    implementation "com.google.android.material:material:1.4.0"
    implementation "androidx.constraintlayout:constraintlayout:2.1.2"
    implementation "androidx.viewpager2:viewpager2:1.0.0"
    implementation "androidx.fragment:fragment-ktx:1.4.0"
}

Step 2: Creating the Layouts

activity_main.xml

Create the main activity layout that includes the TabLayout and ViewPager2.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:background="?attr/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/tab_layout"/>

</RelativeLayout>

fragment_first.xml

Create a simple layout for the first fragment.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="First Fragment"
        android:textSize="24sp"/>

</RelativeLayout>

fragment_second.xml

Create a simple layout for the second fragment.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Second Fragment"
        android:textSize="24sp"/>

</RelativeLayout>

Step 3: Creating the Fragments

Create two fragments, FirstFragment and SecondFragment, each with its layout.

FirstFragment.kt

package com.example.viewpagerdemo

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment

class FirstFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false)
    }
}

SecondFragment.kt

package com.example.viewpagerdemo

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment

class SecondFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_second, container, false)
    }
}

Step 4: Setting Up the ViewPager Adapter

Create a ViewPagerAdapter class to handle the fragments in the ViewPager2.

ViewPagerAdapter.kt

package com.example.viewpagerdemo

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter

class ViewPagerAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
    private val fragmentList = listOf(
        FirstFragment(),
        SecondFragment()
    )

    override fun getItemCount(): Int {
        return fragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return fragmentList[position]
    }
}

Step 5: Connecting the ViewPager and TabLayout

In your MainActivity, set up the ViewPager2 and TabLayout.

MainActivity.kt

package com.example.viewpagerdemo

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.tabs.TabLayoutMediator
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val viewPagerAdapter = ViewPagerAdapter(this)
        view_pager.adapter = viewPagerAdapter

        val tabTitles = listOf("Tab 1", "Tab 2")
        TabLayoutMediator(tab_layout, view_pager) { tab, position ->
            tab.text = tabTitles[position]
        }.attach()
    }
}

Step 6: Running the Application

Now, you can run your application. You should see a TabLayout with two tabs at the top and a ViewPager2 below it. Swiping left or right will switch between the fragments, and tapping on the tabs will navigate to the respective fragments.

Conclusion

In this blog, we’ve covered how to implement ViewPager and TabLayout in a Kotlin Android application. This combination is a powerful way to create a smooth and user-friendly navigation experience in your app. With ViewPager2 and TabLayout, you can easily add more fragments and customize the behavior to suit your needs.

Feel free to extend this tutorial by adding more fragments, customizing the layouts, or integrating additional features like data binding and view models to manage data more effectively.

This comprehensive guide should provide a solid foundation for implementing ViewPager and TabLayout in your Kotlin Android projects. Happy coding!