【Android介面實現】使用ScrollingTabsView實現有滑動標籤的ViewPager效果
阿新 • • 發佈:2019-01-07
在前面的文章中,我們使用支援包裡面的PagerTabStrip實現了有滑動標籤的viewPager效果,今天,再給大家介紹另外一種開源專案,來實現類似的效果。
在這篇文章中,我們將使用第三方開源專案ViewPagerExtensions實現。
先看效果
ViewPagerExtensions的github地址:https://github.com/astuetz/ViewPagerExtensions
首先給出整個專案的目錄結構
在這個demo之中,我直接把資原始檔全部放在了專案之中,方便使用。
首先,我們看一下佈局檔案activity_main.xml。
我們在佈局檔案中,添加了一個scrollingTabsView控制元件,這個就是上面指示器的自定義控制元件。<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/com.heli17.tradeshowcloud" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.astuetz.viewpager.extensions.ScrollingTabsView android:id="@+id/scrolling_tabs" android:layout_width="fill_parent" android:layout_height="38dp" android:background="@drawable/tab_unselected_holo" app:dividerDrawable="@android:color/white" /> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
佈局寫好了之後,我們就可以在程式碼裡面設定介面卡了。
程式碼如下:
在程式碼裡面,我們需要設定兩個介面卡,一個是ViewPager的,用來更換顯示的fragment,另外一個就是上面滑動的tab佈局的,用來控制每一個tab顯示的佈局,在getView方法裡面返回。package com.example.scrollingtabsdemo; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.widget.Button; import com.astuetz.viewpager.extensions.ScrollingTabsView; import com.astuetz.viewpager.extensions.TabsAdapter; public class MainActivity extends FragmentActivity { private ViewPager viewPager; private ScrollingTabsAdapter scrollingTabsAdapter; private ScrollingTabsView scrollingTabs; private FragsAdapter pagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.pager); // 設定介面卡 pagerAdapter = new FragsAdapter(getSupportFragmentManager()); viewPager.setAdapter(pagerAdapter); // 設定快取fragment的數量 viewPager.setOffscreenPageLimit(2); viewPager.setCurrentItem(0); viewPager.setPageMargin(4); scrollingTabsAdapter = new ScrollingTabsAdapter(this); // 設定滑動標籤的介面卡和宿主ViewPager scrollingTabs = (ScrollingTabsView) findViewById(R.id.scrolling_tabs); scrollingTabs.setAdapter(scrollingTabsAdapter); scrollingTabs.setViewPager(viewPager); } /** * ViewPager介面卡 * * @author zhaokaiqiang * */ private class FragsAdapter extends FragmentStatePagerAdapter { private ArrayList<Fragment> fragments; public FragsAdapter(FragmentManager fm) { super(fm); fragments = new ArrayList<Fragment>(); for (int i = 0; i < scrollingTabsAdapter.mTitles.length; i++) { fragments.add(new MyFragment(i)); } } @Override public int getCount() { return fragments.size(); } @Override public Fragment getItem(int position) { return fragments.get(position); } } /** * 滑動標籤介面卡 * * @author zhaokaiqiang * */ private class ScrollingTabsAdapter implements TabsAdapter { private Activity mContext; public String[] mTitles = { "首頁", "推薦", "最新", "娛樂", "設定" }; public ScrollingTabsAdapter(Activity ctx) { this.mContext = ctx; } @Override public View getView(int position) { Button tab = (Button) mContext.getLayoutInflater().inflate( R.layout.tab_scrolling, null); tab.setText(mTitles[position]); return tab; } } }
這裡的R.layout.tab_scrolling是自定義的一個佈局,程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/tab_holo"
android:gravity="center"
android:paddingBottom="8dp"
android:paddingLeft="30dip"
android:paddingRight="30dip"
android:paddingTop="8dp"
android:textColor="@android:color/holo_blue_light"
android:textSize="16sp" />
大家可以根據自己的需求進行更改。
這種滑動的tab適合介面比較多的情況,所以在Viewpagr的介面卡的選擇上使用的是FragmentPagerStateAdapter,如果滑動的介面在3個或者3個以下,推薦使用FixedTabsView,使用方法和這個完全一樣,另外,ViewPager的介面卡換成FragmentPagerAdapter比較合適。