KotlinでAndroidアプリにタブレイアウト(TabLayout)を実装する方法を徹底解説
この記事では、Kotlinを使用してAndroidアプリにタブレイアウト(TabLayout)を作成する方法を、実際のコード例とともにステップごとに解説します。タブとViewPagerを連携させることで、スワイプ操作でも画面を切り替えられる実用的なUIを実現できます。
完成イメージ
本チュートリアルでは、「Football(サッカー)」「Cricket(クリケット)」「NBA」の3つのタブを持つアプリを作成します。各タブをタップすると対応するフラグメントが表示され、ViewPagerとの連動により横スワイプでもページ遷移が可能です。
Step 1:新規プロジェクトの作成
Android Studioを起動し、メニューから「File」→「New Project」を選択して、必要な情報を入力して新しいプロジェクトを作成します。
Step 2:activity_main.xml にコードを追加
res/layout/activity_main.xml に以下のコードを記述します。TabLayoutとViewPagerを配置しています。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://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/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#1db995">
</com.google.android.material.tabs.TabLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tabLayout"
android:layout_centerInParent="true"
android:layout_marginTop="100dp"
tools:layout_editor_absoluteX="8dp" />
</RelativeLayout>ポイントとして、TabLayoutには背景色(#1db995)を指定しており、ViewPagerはTabLayoutの下に配置されています。
Step 3:MainActivity.kt にコードを追加
src/MainActivity.kt に以下のコードを記述します。ここでタブの追加、アダプターの設定、タブ選択とページ遷移の連携処理を行います。
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager.widget.ViewPager
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
import com.google.android.material.tabs.TabLayout.TabLayoutOnPageChangeListener
class MainActivity : AppCompatActivity() {
lateinit var tabLayout: TabLayout
lateinit var viewPager: ViewPager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
tabLayout = findViewById(R.id.tabLayout)
viewPager = findViewById(R.id.viewPager)
tabLayout.addTab(tabLayout.newTab().setText("Football"))
tabLayout.addTab(tabLayout.newTab().setText("Cricket"))
tabLayout.addTab(tabLayout.newTab().setText("NBA"))
tabLayout.tabGravity = TabLayout.GRAVITY_FILL
val adapter = MyAdapter(this, supportFragmentManager,
tabLayout.tabCount)
viewPager.adapter = adapter
viewPager.addOnPageChangeListener(TabLayoutOnPageChangeListener(tabLayout))
tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
viewPager.currentItem = tab.position
}
override fun onTabUnselected(tab: TabLayout.Tab) {}
override fun onTabReselected(tab: TabLayout.Tab) {}
})
}
}このコードでは、addOnPageChangeListenerでViewPagerのページ変更をTabLayoutに反映し、onTabSelectedでタブ選択時にViewPagerの表示ページを切り替えています。これにより双方向の同期が実現されます。
Step 4:アダプタークラス(MyAdapter.kt)の作成
新しいKotlinクラス「MyAdapter.kt」を作成し、以下のコードを追加します。
import android.content.Context
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
@Suppress("DEPRECATION")
internal class MyAdapter(
var context: Context,
fm: FragmentManager,
var totalTabs: Int
) :
FragmentPagerAdapter(fm) {
override fun getItem(position: Int): Fragment {
return when (position) {
0 -> {
Football()
}
1 -> {
Cricket()
}
2 -> {
NBA()
}
else -> getItem(position)
}
}
override fun getCount(): Int {
return totalTabs
}
}アダプターはタブの位置(position)に応じて、表示するフラグメントを返す役割を担います。
Step 5:3つのFragmentクラスとレイアウトの作成
次に、3つのFragmentアクティビティ(Cricket、Football、NBA ※名前は自由に変更可能)を作成し、以下のコードを追加します。
Cricket.kt
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
class Cricket : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// フラグメント用のレイアウトをインフレート
return inflater.inflate(R.layout.fragment_cricket, container, false)
}
}fragment_cricket.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Cricket">
<!-- TODO: 空白フラグメントのレイアウトを更新 -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Cricket Fragment"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
</FrameLayout>Football.kt
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
class Football : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// フラグメント用のレイアウトをインフレート
return inflater.inflate(R.layout.fragment_football, container, false)
}
}fragment_football.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Football">
<!-- TODO: 空白フラグメントのレイアウトを更新 -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Football Fragment"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
</FrameLayout>NBA.kt
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
class NBA : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// フラグメント用のレイアウトをインフレート
return inflater.inflate(R.layout.fragment_n_b_a, container, false)
}
}fragment_n_b_a.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NBA">
<!-- TODO: 空白フラグメントのレイアウトを更新 -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="NBA Fragment"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold" />
</FrameLayout>Step 6:AndroidManifest.xml の確認・編集
androidManifest.xml に以下のコードを追加します。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.q11">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>アプリの実行方法
それでは、アプリケーションを実行してみましょう。Android端末をパソコンに接続していることを前提としています。Android Studioからアプリを実行するには、プロジェクト内のアクティビティファイルを開き、ツールバーのRun(実行)アイコンをクリックします。表示された選択肢から接続中のモバイルデバイスを選択すると、実機の画面にアプリが起動します。

以下のように、タブをタップまたはスワイプすることで、それぞれのフラグメント画面が切り替わることを確認できます。



-
FacebookでAndroidアプリを作成する方法|開発者サイトでの設定手順を徹底解説
この記事では、FacebookでAndroidアプリを作成する方法について詳しく解説します。AndroidアプリとFacebookを連携させるには、Facebook開発者サイトでFacebookアプリを作成し、Facebook App IDを取得する必要があります。以下の手順に従って、順番に進めていきましょう。 準備:Facebook開発者サイトで新しいアプリを追加する まず、https://developers.facebook.com/ にアクセスし、「新しいアプリを追加」をクリックしてアプリの作成を開始します。 ステップ1:アプリ名とメールアドレスを入力する 指定されたフィールドに、作
-
【Android】XMLファイルを使ってアニメーションを作成する方法をわかりやすく解説
この記事では、AndroidアプリにおいてXMLファイルを使用してアニメーションを作成する方法を、実際のコード例とともに段階的に解説します。View Animation(Tween Animation)は、res/animディレクトリに配置したリソースファイルとして定義できるため、フェードインやズーム、点滅といった演出をJava側のコードをほとんど書かずに実現できるのが特徴です。 ステップ1:新規プロジェクトの作成 Android Studioを起動し、メニューから「File」⇒「New Project」を選択して新しいプロジェクトを作成します。ウィザードに従って必要な情報を入力し、プロジェク