如何在Android中實現帶有圖示的TabLayout?


帶有圖示的TabLayout已成為Android開發中流行的UI元件。它透過提供水平佈局的選項卡簡化了應用程式內的導航。每個選項卡代表一個不同的類別或功能,並且可以透過整合圖示來增強視覺效果。圖示和標籤的組合使使用者更容易理解每個選項卡的目的。

選擇一個選項卡後,將顯示相應的內容。這通常在ViewPager中完成。要實現帶有圖示的TabLayout,需要建立必要的佈局併為每個選項卡的內容管理片段或活動。它還涉及自定義外觀以適應應用程式的設計。這種導航解決方案不僅增強了使用者體驗,而且透過提供使用者友好且視覺上吸引人的介面來提高應用程式的可用性。

TabLayout

TabLayout是Android框架中的一個UI元件,它為使用者提供了一種使用者友好的方式來整合水平佈局的選項卡。此多功能功能通常用於有效組織和在應用程式內的多個螢幕或部分之間進行無縫導航。每個選項卡代表一個不同的類別或功能,允許使用者透過簡單點選相應的選項卡來輕鬆地在它們之間切換。

TabLayout通常與ViewPager一起使用。ViewPager負責管理與每個選項卡相關的內容。這種組合允許根據選擇的選項卡在不同的片段或活動之間進行無縫導航。此外,TabLayout提供了各種自定義選項,例如新增圖示、設定文字標籤和應用樣式。這些功能使其能夠適應各種應用程式設計和要求。

方法

在Android中實現TabLayout有不同的方法,我們將研究一些常用的方法。

  • 方法 1:使用自定義檢視作為選項卡項

  • 方法 2:使用帶有圖示的預設TabLayout設定

方法 1:使用自定義檢視作為選項卡項

在Android中整合帶有圖示的TabLayout的一種方法是為每個選項卡項使用自定義檢視。此方法需要為選項卡項設計一個唯一的XML佈局檔案,其中包括用於圖示的ImageView和用於標題的TextView。在您的活動或片段中,您可以設定TabLayout和ViewPager,然後為每個單獨的選項卡建立自定義選項卡檢視。

每個選項卡的自定義檢視允許輕鬆檢索。在此檢視中,可以找到ImageView和TextView元件,從而可以根據需要自定義圖示和標題。透過整合自定義檢視,使用者可以增強對TabLayout中選項卡項的外觀和佈局的控制,使他們能夠無縫顯示圖示以及相應的標題。

演算法

  • 應建立主活動或片段的XML佈局檔案,其中包括TabLayout和ViewPager。

  • 此外,應為自定義選項卡項建立一個單獨的XML佈局檔案,其中包含分別用於圖示和標題的ImageView和TextView。

  • 要在活動或片段中獲取對TabLayout和ViewPager的引用,應使用它們的相應ID。

  • ViewPager需要使用合適的介面卡進行設定,以處理選項卡的內容。

  • 為了將TabLayout與ViewPager關聯,請使用setupWithViewPager()方法。

  • 使用迴圈迭代遍歷TabLayout中的每個選項卡。對於每個選項卡,檢索其Tab物件,並使用setCustomView()方法自定義其檢視。

  • 在此自定義檢視中,使用其各自的ID找到ImageView和TextView。

  • 透過分別在ImageView和TextView上呼叫setImageResource()和setText()等方法,為每個選項卡設定相關的圖示和標題資訊。

  • 為了根據需要使用所需的圖示和標題配置其自定義檢視,請迭代地重複所有選項卡的步驟。可以使用自定義選項來根據特定要求調整TabLayout的外觀和行為。

  • 此外,還可以整合其他功能,例如響應選項卡選擇事件或根據選項卡更改更新ViewPager中的內容。

示例

// activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
   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_alignParentBottom="true"
      app:tabGravity="fill"
      app:tabMode="fixed"
      app:tabIndicatorHeight="0dp" />

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

</RelativeLayout>

//MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;

import android.os.Bundle;

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

public class MainActivity extends AppCompatActivity {

   private static final String[] tabTitles = {"Tab 1", "Tab 2", "Tab 3"};
   private static final int[] tabIcons = {R.drawable.ic_tab1, R.drawable.ic_tab2, R.drawable.ic_tab3};

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

      TabLayout tabLayout = findViewById(R.id.tab_layout);
      ViewPager2 viewPager = findViewById(R.id.view_pager);
      viewPager.setAdapter(new ViewPagerAdapter(this));

      new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
         tab.setIcon(tabIcons[position]);
         tab.setText(tabTitles[position]);
      }).attach();
   }
}

// ViewPagerAdapter.java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class ViewPagerAdapter extends RecyclerView.Adapter<ViewPagerAdapter.ViewHolder> {

   private final Context context;

   public ViewPagerAdapter(Context context) {
      this.context = context;
   }

   @NonNull
   @Override
   public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
      View view = LayoutInflater.from(context).inflate(R.layout.item_view_pager, parent, false);
      return new ViewHolder(view);
   }

   @Override
   public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
      holder.textView.setText("Page " + (position + 1));
   }

   @Override
   public int getItemCount() {
      return 3; // Change this value based on the number of tabs
   }

   public static class ViewHolder extends RecyclerView.ViewHolder {
      TextView textView;

      public ViewHolder(View itemView) {
         super(itemView);
         textView = itemView.findViewById(R.id.textView);
      }
   }
}
ic_tab1.png, ic_tab2.png, ic_tab3.png in res/drawable

// item_view_pager.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center"
   android:orientation="vertical">

   <TextView
      android:id="@+id/textView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:textAppearance="?android:textAppearanceLarge" />

</LinearLayout>

輸出

方法 2:使用帶有圖示的預設TabLayout設定

在Android中實現帶有圖示的TabLayout的另一種方法是使用預設的TabLayout設定,它支援包含圖示。這種方法無需建立自定義檢視,因為它允許直接為每個選項卡分配圖示。

配置好TabLayout和ViewPager後,您可以輕鬆地瀏覽每個選項卡,並使用setIcon()方法指定所需的圖示資源。

透過利用此方法,您可以利用TabLayout的內建功能來管理選項卡選擇和樣式,同時簡化實現。這種直接的方法簡化了在TabLayout中將圖示與選項卡關聯的過程,從而無需額外修改即可實現預期的視覺效果。

演算法

  • 需要為主活動或片段建立XML佈局檔案。這包括包含TabLayout和ViewPager元件。

  • 首先,在您的活動或片段中獲取對TabLayout和ViewPager的引用。

  • 接下來,使用合適的介面卡設定ViewPager以處理選項卡的內容。使用setupWithViewPager()方法將TabLayout與ViewPager關聯。

  • 之後,迭代遍歷TabLayout中的每個選項卡,並使用getTabAt()方法檢索其各自的Tab物件。

  • 如果Tab物件不為空,則可以使用setIcon()設定圖示來自定義其外觀。

  • 此外,請根據需要對TabLayout進行任何必要的調整以符合您的外觀和行為。

  • 最後,處理可能需要的任何其他功能,例如響應選項卡選擇事件或根據選項卡更改更新ViewPager中的內容。

程式

// activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
   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_alignParentBottom="true"
      app:tabGravity="fill"
      app:tabMode="fixed"
      app:tabIndicatorHeight="0dp" />

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

</RelativeLayout>

// MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;

import android.os.Bundle;

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

public class MainActivity extends AppCompatActivity {

   private static final int[] tabIcons = {
         R.drawable.ic_tab1,
         R.drawable.ic_tab2,
         R.drawable.ic_tab3
   };

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

      TabLayout tabLayout = findViewById(R.id.tab_layout);
      ViewPager2 viewPager = findViewById(R.id.view_pager);
      viewPager.setAdapter(new ViewPagerAdapter(this));

      TabLayoutMediator mediator = new TabLayoutMediator(tabLayout, viewPager,
            (tab, position) -> tab.setIcon(tabIcons[position])
      );
      mediator.attach();
   }
}

// ViewPagerAdapter.java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class ViewPagerAdapter extends RecyclerView.Adapter<
ViewPagerAdapter.ViewHolder> {

   private final Context context;

   public ViewPagerAdapter(Context context) {
      this.context = context;
   }

   @NonNull
   @Override
   public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
      View view = LayoutInflater.from(context).inflate(R.layout.item_view_pager, parent, false);
      return new ViewHolder(view);
   }

   @Override
   public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
      holder.textView.setText("Page " + (position + 1));
   }

   @Override
   public int getItemCount() {
      return 3; // Change this value based on the number of tabs
   }

   public static class ViewHolder extends RecyclerView.ViewHolder {
      TextView textView;

      public ViewHolder(View itemView) {
         super(itemView);
         textView = itemView.findViewById(R.id.textView);
      }
   }
}

ic_tab1.png, ic_tab2.png, ic_tab3.png in res/drawable

// item_view_pager.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center"
   android:orientation="vertical">

   <TextView
      android:id="@+id/textView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:textAppearance="?android:textAppearanceLarge" />

</LinearLayout>

輸出

結論

總之,可以透過兩種主要方法實現帶有圖示的TabLayout:使用自定義檢視作為選項卡項或使用預設的TabLayout設定。自定義檢視方法透過為每個選項卡項建立不同的XML佈局檔案,提供了更大的靈活性和個性化。相反,預設設定透過直接將圖示分配給各個選項卡來簡化流程。

更新於:2023年7月27日

983 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.