1. 程式人生 > >tablayout+viewpager+fragment實現頁面底部導航欄

tablayout+viewpager+fragment實現頁面底部導航欄

先附上效果圖


第一步:書寫佈局

我的佈局檔案是這樣的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
    <android.support.v4.view.ViewPager
android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="9"> </android.support.v4.view.ViewPager> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height=
"match_parent" android:layout_gravity="fill_horizontal|center_horizontal" android:background="@color/colorPrimary" app:tabTextColor="@color/tabTextColor" android:layout_weight="1"> </android.support.design.widget.TabLayout> </LinearLayout>

第二步:自定義fragment介面卡

package com.example.wf.study;
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import java.util.ArrayList; import java.util.List; /** * Created by WF on 2018/6/29. */ public class MyFragmentAdapter extends FragmentPagerAdapter { private List<Fragment> mFragmentList; public void setFragments(ArrayList<Fragment> fragments) { mFragmentList = fragments; } public MyFragmentAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Fragment fragment = mFragmentList.get(position); return fragment; } @Override public int getCount() { return mFragmentList.size(); } @Override public CharSequence getPageTitle(int position) { return super.getPageTitle(position); } }

第三步:書寫activity

package com.example.wf.study;
import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.wf.study.fragment.FourFragment;
import com.example.wf.study.fragment.OneFragment;
import com.example.wf.study.fragment.ThreeFragment;
import com.example.wf.study.fragment.TwoFragment;
import java.util.ArrayList;
public class TabLayoutActivity extends AppCompatActivity {
    private TabLayout tabLayout;
    private ViewPager viewPager;
String[] tabName = {"&#xe633", "大廳", "任務", "我的"};
    int[] tab_img = {R.drawable.head4, R.drawable.head2, R.drawable.e4well, R.drawable.cat, R.drawable.head1};
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab_layout);
tabLayout = findViewById(R.id.tab_layout);
viewPager = findViewById(R.id.view_pager);
Typeface iconfont = Typeface.createFromAsset(getAssets(), "fonts/iconfont.ttf");
// 建立一個集合,裝填Fragment
ArrayList<Fragment> fragments = new ArrayList<>();
// 裝填
fragments.add(new OneFragment());
fragments.add(new TwoFragment());
fragments.add(new ThreeFragment());
fragments.add(new FourFragment());
// 建立ViewPager介面卡
MyFragmentAdapter myPagerAdapter = new MyFragmentAdapter(getSupportFragmentManager());
myPagerAdapter.setFragments(fragments);
// 給ViewPager設定介面卡
viewPager.setAdapter(myPagerAdapter);
// 使用 TabLayout 和 ViewPager 相關聯
tabLayout.setupWithViewPager(viewPager);
// TabLayout 指示器 (記得自己手動建立4個Fragment,注意是 app包下的Fragment 還是 V4包下的 Fragment)
tabLayout.setTabTextColors(ColorStateList);
tabLayout.getTabAt(0).setText("主頁").setIcon(tab_img[0]);
tabLayout.getTabAt(1).setText("大廳").setIcon(tab_img[0]);
tabLayout.getTabAt(2).setText("任務").setIcon(tab_img[0]);
tabLayout.getTabAt(3).setText("我的").setIcon(tab_img[0]);
        for (int i = 0; i < 4; i++) {
            setTabItem(i);
}
    }}

注:這裡我在將tabLayout與viewPager進行繫結後,直接使用getTabAt()方法獲取一個tab,但是我並沒有使用addTab()方法來新增過任何一個tab,那為什麼能夠拿到tab呢?

原因如下:檢視TabLayout原始碼發現這樣一個方法

void populateFromPagerAdapter() {
    removeAllTabs();
    if (mPagerAdapter != null) {
        final int adapterCount = mPagerAdapter.getCount();
        for (int i = 0; i < adapterCount; i++) {
            addTab(newTab().setText(mPagerAdapter.getPageTitle(i)), false);
}

        // Make sure we reflect the currently set ViewPager item
if (mViewPager != null && adapterCount > 0) {
            final int curItem = mViewPager.getCurrentItem();
            if (curItem != getSelectedTabPosition() && curItem < getTabCount()) {
                selectTab(getTabAt(curItem));
}
        }
    }
}
相信你已經注意到了,在第一個for迴圈中,它已經根據我已經關聯的fragment個數建立了相應個數的tab。再拓展一下,這裡他呼叫了getPageTitle()方法獲取並設定tab標題,所以我們可以在自定義的fragment介面卡中重寫該方法,讓他返回一個標題(不然它返回為空字元,你會看不到標題),這樣我們就可以不使用setText()方法設定標題了。

二、通過自定義佈局檔案自定義tab樣式

1、自定義一個tab_item.xml檔案

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
    <ImageView
android:id="@+id/tab_img"
android:layout_width="24dp"
android:layout_height="24dp"
android:contentDescription="@string/app_name"
android:scaleType="fitXY"
android:src="@drawable/selector_tab_image" />
    <TextView
android:id="@+id/tab_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="兒童"
android:textColor="@drawable/selector_tab_text" />
</LinearLayout>

這是tab的通用樣式,可以通過改變圖片和文字來達到顯示不同的效果

2、通過activity來配置顯示效果

package com.example.wf.study;
import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.wf.study.fragment.FourFragment;
import com.example.wf.study.fragment.OneFragment;
import com.example.wf.study.fragment.ThreeFragment;
import com.example.wf.study.fragment.TwoFragment;
import java.util.ArrayList;
public class TabLayoutActivity extends AppCompatActivity {
    private TabLayout tabLayout;
    private ViewPager viewPager;
String[] tabName = {"主頁", "大廳", "任務", "我的"};
    int[] tab_img = {R.drawable.head4, R.drawable.head2, R.drawable.e4well, R.drawable.cat, R.drawable.head1};
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab_layout);
tabLayout = findViewById(R.id.tab_layout);
viewPager = findViewById(R.id.view_pager);
Typeface iconfont = Typeface.createFromAsset(getAssets(), "fonts/iconfont.ttf");
// 建立一個集合,裝填Fragment
ArrayList<Fragment> fragments = new ArrayList<>();
// 裝填
fragments.add(new OneFragment());
fragments.add(new TwoFragment());
fragments.add(new ThreeFragment());
fragments.add(new FourFragment());
// 建立ViewPager介面卡
MyFragmentAdapter myPagerAdapter = new MyFragmentAdapter(getSupportFragmentManager());
myPagerAdapter.setFragments(fragments);
// 給ViewPager設定介面卡
viewPager.setAdapter(myPagerAdapter);
// 使用 TabLayout 和 ViewPager 相關聯
tabLayout.setupWithViewPager(viewPager);
        for (int i = 0; i < 4; i++) {
            setTabItem(i);
}

    }

    public void setTabItem(int position) {
        View view = LayoutInflater.from(this).inflate(R.layout.tab_item, null);
TextView textView = (TextView) view.findViewById(R.id.tab_name);
textView.setText(tabName[position]);
ImageView imageView=(ImageView)view.findViewById(R.id.tab_img);
imageView.setImageResource(tab_img[position]);
tabLayout.getTabAt(position).setCustomView(view);
}
}

這裡通過獲取到tab_item佈局檔案的view物件,通過該物件獲取我們定義的ImageView和TextView並設定相關屬性,最後通過setCustomView()方法將view傳給tab顯示。

相關推薦

tablayout+viewpager+fragment實現頁面底部導航

先附上效果圖第一步:書寫佈局我的佈局檔案是這樣的<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an

TabLayout+ViewPager+Fragment實現頂部或底部導航

以前看慕課網的教程,寫過一個微信Tab選項卡切換的例子,使用的是ViewPager+Fragment來實現的,說實話,當時為了實現一些效果,還是寫了蠻多的程式碼,但是,今天介紹的TabLayout+ViewPager+Fragment實現導航欄可以使用很少的程式

TabLayout+ViewPager+Fragment實現底部導航

MainActivity extends AppCompatActivity { private TabLayout mTabLayout; //Tab 文字 private final int[] TAB_TITLES = new int[]{R.string.weixin,R.string.con

Android TabLayout+ViewPager+Fragment實現tab的時候,無法實時更新ViewPager內的Fragment問題終極解決方法

TabLayout+ViewPager+Fragment模式在應用中必不可少,有時候我們可能會遇到tab欄會動態改變的問題,如新增,或刪減,這時候就需要把viewpager內相應的fragment新增或刪減; 如想做以下等操作? 1、更新單個item mDataList.remove(0

三種方式實現Android頁面底部導航

我們在Android手機上使用新浪微博和QQ等一些軟體時,經常會遇到類似下面這種頁面底部導航欄的控制元件,使用這種導航欄可以在手機螢幕的一頁中顯示儘可能多的內容,如下圖所示: 下面我將實現這種導航欄的三種方法總結如下: 一、使用TabHost實現(TabHost在新版的A

TabLayout+ViewPager+Fragment實現多條目載入(多個介面)

要求: 實現如圖所示效果,上方TabLayout,下面ViewPager+Fragment,下拉重新整理,上拉載入更多,多條目載入,顯示title標題,根據images圖片數量進行多條目載入。 介面如下,其中page為頁數,lid為上方標題的id https://feed.mix.s

TabLayout+ViewPager+Fragment實現滑動效果

實現的效果圖如下: 一、頁面佈局檔案  1. 主頁面tab_main.xml,程式碼如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://sc

TabLayout+ViewPager+Fragment實現多條目載入

要求: 實現如圖所示效果,上方TabLayout,下面ViewPager+Fragment,下拉重新整理,上拉載入更多,多條目載入,顯示title標題,根據images圖片數量進行多條目載入。 介面如下,其中page為頁數,lid為上方標題的id https://fee

React Native—使用ScrollableTabView實現APP底部導航(帶訊息圓點)

icon_selected color:#d81e06 icon_unselected color:#515151 一、前言 這段時間在公司開始搞React Native開發,要對APP的主頁底部導航欄進行替換,尋找了多種方法,最後使用react-native-scro

使用 flutter 實現一個底部導航

現如今開啟一個 App,比如微信、支付寶,都能看到一個底部導航欄,用來切換到不同的展示頁。今天就用 Flutter 實現一下這種效果。 在 Flutter 裡,基本上所有的東西都是元件。Flutter 也已經有了現成的底部導航欄元件了 -- BottomNavigationBar,所以用 Flutter

首頁-底部&頂部Tab導航(選單)的實現TabLayout+ViewPager+Fragment

前言 Android開發中使用頂部 & 底部Tab導航欄的頻次非常高,主要的實現手段有以下: TabWidget 隱藏TabWidget,使用RadioGroup和RadioButton FragmentTabHost 5.0以後的TabLayou

ViewPager+Fragment滑動切換頁面(RadioButton底部導航)

      Activity要繼承FragementActivity,在Activity的佈局檔案中放入了一個ViewPager,為了效果好看,還做了個導航,使得ViewPager和導航欄能夠實現聯動,即ViewPager滑動切換頁面和點選導航欄切換頁面,

android使用ViewpagerTabLayout結合fragment實現首頁底部導航的效果

前言 現如今幾乎每一款手機APP首頁都採用了底部導航的功能,現在我們使用Viewpager和TabLayout結合fragment來實現該功能。 效果圖如下: 這裡有一個問題,TabLayout的五個icon在模擬器中寬度無法充滿螢幕,暫時還不知道為什麼,手機能夠正

Android專案導航之仿微信底部導航TabLayout+ViewPager+Fragment

一、實現效果: 二、依賴jar包: compile 'com.android.support:design:24+'三、專案工程結構: 四、XML佈局 activity_main.xml佈局: <?xml version="1.0" encoding="u

底部導航實現頁面的切換(一):Fragment + LinearLayout + TextView

Fragment + LinearLayout + TextView 實現底部導航欄的切換(一) 知識點 先看效果圖: 專案結構圖: 實現邏輯: 頂部是Linea

底部導航:利用viewpager實現Android底部標題

設定小紅點和數字方法: http://blog.csdn.net/yancychas/article/details/77331177 方法一. ViewPager + List<View> + PagerAdapter 先看activity_main

Android仿小米商城底部導航之二(BottomNavigationBar、ViewPagerFragment的聯動使用)

簡介 在前文《Android仿小米商城底部導航欄(基於BottomNavigationBar)》我們使用BottomNavigationBar控制元件模仿實現了小米商城底部導航欄效果。接下來更進一步的,我們將通過BottomNavigationBar控制元件和

BottomNavigationView + ViewPager + Fragment 實現左右滑動和下方導航

轉載請註明出處:http://blog.csdn.net/htwhtw123/article/details/78441431 比較簡單的用BottomNavigationView 、 ViewPager 、 Fragment 實現下方導航欄與上方可翻頁頁面,

Android開發之TabLayout真正實現底部導航(可實現點選文字顏色圖片切換)

前言:關於這個TabLayout實現底部導航,在我的上篇《Android開發之TabLayout實現底部導航欄》部落格中有提到,但是後面在仔細的接觸專案中,發現了裡面有很多沒有解決的事情,比如不能實現點選文字顏色和圖片的切換,不能做到禁止左右滑動,所以趁著今天有時間的情況下

安卓APP底部導航(有訊息圓點指示器),實現fragment切換(eclipse)

本專案使用了相對佈局和單選按鈕實現了安卓app常見的底部導航欄(帶有訊息圓點指示器),效果如果所示 一、佈局程式碼如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi