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.ViewPagerandroid: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 = {"", "大廳", "任務", "我的"}; 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使用Viewpager和TabLayout結合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、ViewPager和Fragment的聯動使用)
簡介 在前文《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