怎樣抽取一個“滑動標(biāo)題欄+ViewPager”?

怎樣抽取一個“滑動標(biāo)題欄+ViewPager”?

前段時間遇到一個需求:滑動標(biāo)題欄+可滑動的viewpager展示頁面數(shù)據(jù),然后到github上找了一圈,發(fā)現(xiàn)這個作者寫的工程還是蠻好用的LuckyJayce/ViewPagerIndicator,效果如圖:

pic1
pic1

  • 為什么要抽取這個東西呢?
    因為想要下次遇到的時候直接使用,不要到git上去查找,然后添加,提高開發(fā)效率。
  • 如何抽取"滑動標(biāo)題欄+ViewPager"?
    • 第一步,我們需要下載這個作者的Example,然后運行跑起來,下載地址:demo
    • 第二步,抽取我們依賴的java代碼到我們的Lib庫里,將ColorBar、ScrollBar、OnTransitionTextListener、FixIndicatorView、FragmentListPagerAdapter、Indicator、IndicatorViewPager、ScrollIndicaotorView、ColorGradient、RecycleBin、RecyclingPagerAdapter、SViewPager抽取到我們的Lib庫
    • 第三步,現(xiàn)繪制界面,fragment_scroll_viewpager.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:orientation="vertical">
          <lib.view.indicator.ScrollIndicatorView
              android:id="@+id/moretab_indicator"
              android:layout_width="match_parent"
              android:layout_height="45dp" />
          <android.support.v4.view.ViewPager
              android:id="@+id/moretab_viewPager"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />
      </LinearLayout>
      
    • 第四步,定義一個ScrollViewpagerBaseFragment繼承自BaseFragment,先初始化界面的所有控件,如:
      @Bind(B.id.moretab_indicator)
      ScrollIndicatorView scrollIndicatorView;
      @Bind(B.id.moretab_viewPager)
      ViewPager viewPager;
      @Override
      public int getLayoutId() {
          return R.layout.fragment_scroll_viewpager;
      }
      
    • 第五步,因為這個界面的展示需要的數(shù)據(jù)有標(biāo)題和子Fragment,所以有兩個方法特別重要,如:
      public abstract BaseFragment[] getChildFragments();
      public abstract String[] getChildTitles();
      
      因為是抽象的,所以我們定義的這個ScrollViewpagerBaseFramgnt也是一個抽象類,這樣你自定義一個fragment繼承自ScrollViewPagerBaseFragment,就必須重寫這兩個方法。
    • 第六步,在onCreaview中調(diào)用getChildFragments()和getChildTitles(),賦值給這個類中的fragmentList和titles。
    @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View rootView=super.onCreateView(inflater, container, savedInstanceState);
       fragmentList=getChildFragments();
       titles=getChildTitles();
       Log.i(TAG,titles.toString());
       Log.i(TAG,fragmentList.toString());
       initScrollViewPager(titles,fragmentList);
       return rootView;
   }
    ```
  * 第七步,初始化標(biāo)題欄和Viewpager的適配器
    ```java
    //fragment的適配器
    private class MyAdapter extends IndicatorViewPager.IndicatorFragmentPagerAdapter {

        public MyAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }

        @Override
        public int getCount() {
            return fragmentList.length;
        }

        @Override
        public View getViewForTab(int position, View convertView, ViewGroup container) {
            if (convertView == null) {
                convertView = getActivity().getLayoutInflater().inflate(R.layout.tab_top, container, false);
            }
            TextView textView = (TextView) convertView;
            textView.setText(titles[position]);

            int witdh = getTextWidth(textView);
//            int padding = DisplayUtil.dipToPix(getContext(), 8);
            //因為wrap的布局 字體大小變化會導(dǎo)致textView大小變化產(chǎn)生抖動,這里通過設(shè)置textView寬度就避免抖動現(xiàn)象
            //1.3f是根據(jù)上面字體大小變化的倍數(shù)1.3f設(shè)置
            textView.setWidth((int) (witdh * 1.13f) + 0);
            return convertView;
        }

        @Override
        public Fragment getFragmentForPage(int position) {
            return fragmentList[position];
        }

        private int getTextWidth(TextView textView) {
            if (textView == null) {
                return 0;
            }
            Rect bounds = new Rect();
            String text = textView.getText().toString();
            Paint paint = textView.getPaint();
            paint.getTextBounds(text, 0, text.length(), bounds);
            int width = bounds.left + bounds.width();
            return width;
        }

    }
    //設(shè)置數(shù)據(jù)源
    public void initScrollViewPager(String[] titles,BaseFragment[] fragmentList){
          scrollIndicatorView.setOnTransitionListener(new OnTransitionTextListener().setColor(0xFF2196F3, Color.GRAY).setSize(selectSize, unSelectSize));
  
          scrollIndicatorView.setScrollBar(new ColorBar(getContext(), 0xFF2196F3, 4));
  
          viewPager.setOffscreenPageLimit(2);
          indicatorViewPager = new IndicatorViewPager(scrollIndicatorView, viewPager);
          indicatorViewPager.setAdapter(new MyAdapter(getActivity().getSupportFragmentManager()));
          indicatorViewPager.setCurrentItem(0, true);
      }
    ```

* 如何使用抽取的“滑動標(biāo)題欄+ViewPager”?  
  直接自定義一個TestFragment繼承自ScrollViewpagerBaseFragment,然后系統(tǒng)會提示你去重寫ScrollViewpagerBaseFragment的抽象方法,然后初始化數(shù)據(jù),并將初始化的數(shù)據(jù)賦值給這兩個方法,就可以使用"滑動標(biāo)題欄+ViewPager"了。
```java
  public class TestFragment extends ScrollViewpagerBaseFragment{
    private BaseFragment[] childsFragment = {new DeviceInfoFragment(), new DeviceInfoFragment(), new DeviceInfoFragment(), new DeviceInfoFragment(), new DeviceInfoFragment()};
    private String[] childTitle = {"title1","title2","title3","title4","title5"};
    @Override
    public BaseFragment[] getChildFragments() {
        return childsFragment;
    }

    @Override
    public String[] getChildTitles() {
        return childTitle;
    }
}

希望能幫到你!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,716評論 25 709
  • ViewPager在開發(fā)中的使用頻率非常的高,所以在此做個總結(jié)。主要包括以下幾方面: ViewPager的簡介和作...
    西瓜太郎123閱讀 121,760評論 21 261
  • 仿照著知乎寫了一套UI界面,結(jié)合著以前學(xué)的知識,一天就擼了出來,其實也沒啥東西,就是有些沒接觸的地方踩了坑。 效果...
    hongjay閱讀 11,335評論 17 117
  • 入住歐洲的酒店,發(fā)現(xiàn),這里大都位于市郊,有些偏遠(yuǎn),也更靜謐。酒店周圍都被綠樹環(huán)繞,我現(xiàn)在天天早晨,是被小鳥叫醒,而...
    陽光心理師于化化閱讀 141評論 0 0
  • 我們是不是在哪兒見過? 聽到這句話,我們通常能聯(lián)想到這樣一個場景:一個男孩身旁走過一個漂亮姑娘,男孩想借機搭訕,便...
    夏冬陽閱讀 585評論 3 1

友情鏈接更多精彩內(nèi)容