如何在Android中使用ViewPager和Fragment實現TabLayout


透過在Android中使用ViewPager和Fragment實現TabLayout,開發者可以設計出直觀且規劃良好的使用者介面。藉助TabLayout,使用者可以輕鬆瀏覽應用程式中的多個部分或類別,使其更加使用者友好。ViewPager允許在Fragment之間平滑滑動,確保無縫的使用者體驗。透過組合這些元件,開發者可以建立一個選項卡布局,其中每個選項卡對應一個特定的Fragment,顯示其獨特的內容。

透過在Android中使用ViewPager和Fragment實現TabLayout,可以簡化管理多個Fragment和增強應用程式可用性的過程。本指南採用敘述性方法解釋如何透過這種方法建立引人入勝且互動式使用者介面。

TabLayout

TabLayout是Android中一個重要的UI元件,它簡化了多個選項卡的水平排列。它通常與ViewPager和Fragment一起使用,為使用者建立平滑的選項卡式介面。每個選項卡對應螢幕上特定部分或類別的內容,從而可以快速訪問應用程式的重要功能。使用TabLayout,使用者可以輕鬆地在不同的Fragment或螢幕之間切換,無需任何麻煩地瀏覽各個部分。

TabLayout提供視覺指示器,例如選項卡指示器和文字標籤,以突出顯示當前選定的選項卡。當與ViewPager一起使用時,它還支援用於在選項卡之間導航的滑動手勢。開發者可以透過指定各種屬性(包括選項卡重力、選項卡模式和選項卡文字樣式)來自定義TabLayout的外觀,以匹配其應用程式的設計要求。

方法

在Android中使用ViewPager和Fragment實現TabLayout的方法有很多種。以下是三種常見的方法:

  • 使用FragmentPagerAdapter

  • 使用FragmentStatePagerAdapter

  • 使用自定義FragmentPagerAdapter

使用FragmentPagerAdapter

此方法涉及建立一個包含TabLayout和ViewPager的佈局檔案。建立一個FragmentPagerAdapter子類,其中重寫getItem()和getCount()等必要方法,以根據位置提供相應的Fragment。將FragmentPagerAdapter例項設定到ViewPager上,並使用setupWithViewPager()將TabLayout連線到ViewPager。此方法適用於少量Fragment。

演算法

  • 建立一個包含TabLayout和ViewPager的佈局檔案。

  • 建立一個FragmentPagerAdapter子類並重寫必要的方法,例如getItem()和getCount()。

  • 在FragmentPagerAdapter的getItem()方法中,根據位置返回相應的Fragment例項。

  • 使用setAdapter()將FragmentPagerAdapter例項設定到ViewPager上。

  • 使用setupWithViewPager()將TabLayout與ViewPager連線。

示例

// MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.material.tabs.TabLayout;

public class MainActivity extends AppCompatActivity {

   private ViewPager viewPager;
   private TabLayout tabLayout;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      viewPager = findViewById(R.id.viewPager);
      tabLayout = findViewById(R.id.tabLayout);

      viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
      tabLayout.setupWithViewPager(viewPager);
   }

   private static class MyPagerAdapter extends FragmentPagerAdapter {

      MyPagerAdapter(FragmentManager fm) {
         super(fm);
      }

      @Override
      public Fragment getItem(int position) {
         switch (position) {
            case 0:
               return new FragmentOne();
            case 1:
               return new FragmentTwo();
            case 2:
               return new FragmentThree();
            default:
               return null;
         }
      }

      @Override
      public int getCount() {
         return 3;
      }

      @Override
      public CharSequence getPageTitle(int position) {
         switch (position) {
            case 0:
               return "Tab 1";
            case 1:
               return "Tab 2";
            case 2:
               return "Tab 3";
            default:
               return null;
         }
      }
   }
}

// FragmentOne.java, FragmentTwo.java, FragmentThree.java are 
simple fragment classes.

// activity_main.xml

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context=".MainActivity">

   <com.google.android.material.tabs.TabLayout
      android:id="@+id/tabLayout"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:tabMode="fixed" />

   <androidx.viewpager.widget.ViewPager
      android:id="@+id/viewPager"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1" />

</LinearLayout>

輸出

使用FragmentStatePagerAdapter

與先前的方法類似,建立一個包含TabLayout和ViewPager的佈局檔案。但是,使用FragmentStatePagerAdapter而不是FragmentPagerAdapter。FragmentStatePagerAdapter更有效地管理大量Fragment或記憶體密集型內容,因為它根據需要銷燬和重新建立Fragment。

演算法

  • 按照上述步驟操作,但使用FragmentStatePagerAdapter代替FragmentPagerAdapter。

  • 在處理大量Fragment或記憶體密集型內容時,FragmentStatePagerAdapter非常適用。

程式

// MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;

import com.google.android.material.tabs.TabLayout;

public class MainActivity extends AppCompatActivity {

   private ViewPager viewPager;
   private TabLayout tabLayout;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      viewPager = findViewById(R.id.viewPager);
      tabLayout = findViewById(R.id.tabLayout);

      viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
      tabLayout.setupWithViewPager(viewPager);
   }

   private static class MyPagerAdapter extends FragmentStatePagerAdapter {

      MyPagerAdapter(FragmentManager fm) {
         super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
      }

      @Override
      public Fragment getItem(int position) {
         switch (position) {
            case 0:
               return new FragmentOne();
            case 1:
               return new FragmentTwo();
            case 2:
               return new FragmentThree();
            default:
               return null;
         }
      }

      @Override
      public int getCount() {
         return 3;
      }

      @Override
      public CharSequence getPageTitle(int position) {
         switch (position) {
            case 0:
               return "Tab 1";
            case 1:
               return "Tab 2";
            case 2:
               return "Tab 3";
            default:
               return null;
         }
      }
   }
}

// FragmentOne.java, FragmentTwo.java, FragmentThree.java are 
simple fragment classes.

// activity_main.xml

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context=".MainActivity">

   <com.google.android.material.tabs.TabLayout
      android:id="@+id/tabLayout"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:tabMode="fixed" />

   <androidx.viewpager.widget.ViewPager
      android:id="@+id/viewPager"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1" />

</LinearLayout>

輸出

使用自定義FragmentPagerAdapter

此方法涉及建立一個擴充套件FragmentPagerAdapter或FragmentStatePagerAdapter的自定義FragmentPagerAdapter類。在自定義介面卡中重寫必要的方法以處理Fragment的建立和檢索。實現根據所選選項卡確定相應Fragment的邏輯。使用setAdapter()將自定義介面卡設定到ViewPager上,並使用setupWithViewPager()將TabLayout連線到ViewPager。此方法提供了靈活的處理特定需求和定製需求的功能。

演算法

  • 建立一個擴充套件FragmentPagerAdapter或FragmentStatePagerAdapter的自定義FragmentPagerAdapter類。

  • 重寫必要的方法並處理Fragment的建立和檢索。

  • 實現根據所選選項卡確定要顯示哪個Fragment的邏輯。

  • 使用setAdapter()將自定義FragmentPagerAdapter例項設定到ViewPager上。

  • 使用setupWithViewPager()將TabLayout與ViewPager連線。

程式

// MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;

import com.google.android.material.tabs.TabLayout;

public class MainActivity extends AppCompatActivity {

   private ViewPager viewPager;
   private TabLayout tabLayout;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      viewPager = findViewById(R.id.viewPager);
      tabLayout = findViewById(R.id.tabLayout);

      viewPager.setAdapter(new CustomPagerAdapter(getSupportFragmentManager()));
      tabLayout.setupWithViewPager(viewPager);
   }

   private static class CustomPagerAdapter extends FragmentPagerAdapter {

      CustomPagerAdapter(FragmentManager fm) {
         super(fm);
      }

      @Override
      public Fragment getItem(int position) {
         switch (position) {
            case 0:
               return new FragmentOne();
            case 1:
               return new FragmentTwo();
            case 2:
               return new FragmentThree();
            default:
               return null;
         }
      }

      @Override
      public int getCount() {
         return 3;
      }

      @Override
      public CharSequence getPageTitle(int position) {
         switch (position) {
            case 0:
               return "Tab 1";
            case 1:
               return "Tab 2";
            case 2:
               return "Tab 3";
            default:
               return null;
         }
      }
   }
}

// FragmentOne.java, FragmentTwo.java, FragmentThree.java are 
simple fragment classes.

// activity_main.xml

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context=".MainActivity">

   <com.google.android.material.tabs.TabLayout
      android:id="@+id/tabLayout"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:tabMode="fixed" />

   <androidx.viewpager.widget.ViewPager
      android:id="@+id/viewPager"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1" />

</LinearLayout>

輸出

結論

在本教程中,使用ViewPager和Fragment在Android中實現TabLayout提供了一種有效的方法來組織和導航應用程式的不同部分。無論是使用FragmentPagerAdapter、FragmentStatePagerAdapter還是自定義介面卡,這些方法都使開發者能夠建立使用者友好的選項卡式介面,透過允許在Fragment之間無縫切換併為活動選項卡提供視覺指示器來增強使用者體驗。透過利用TabLayout、ViewPager和Fragment的功能,開發者可以建立引人入勝且組織良好的Android應用程式。

更新於:2023年7月27日

2K+ 瀏覽量

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.