怎樣抽取一個“滑動標題欄+ViewPager”?

怎樣抽取一個“滑動標題欄+ViewPager”?

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

pic1
pic1

  • 為什么要抽取這個東西呢?
    因為想要下次遇到的時候直接使用,不要到git上去查找,然后添加,提高開發效率。
  • 如何抽取"滑動標題欄+ViewPager"?
    • 第一步,我們需要下載這個作者的Example,然后運行跑起來,下載地址:demo
    • 第二步,抽取我們依賴的java代碼到我們的Lib庫里,將ColorBar、ScrollBar、OnTransitionTextListener、FixIndicatorView、FragmentListPagerAdapter、Indicator、IndicatorViewPager、ScrollIndicaotorView、ColorGradient、RecycleBin、RecyclingPagerAdapter、SViewPager抽取到我們的Lib庫
    • 第三步,現繪制界面,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;
      }
      
    • 第五步,因為這個界面的展示需要的數據有標題和子Fragment,所以有兩個方法特別重要,如:
      public abstract BaseFragment[] getChildFragments();
      public abstract String[] getChildTitles();
      
      因為是抽象的,所以我們定義的這個ScrollViewpagerBaseFramgnt也是一個抽象類,這樣你自定義一個fragment繼承自ScrollViewPagerBaseFragment,就必須重寫這兩個方法。
    • 第六步,在onCreaview中調用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;
   }
    ```
  * 第七步,初始化標題欄和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的布局 字體大小變化會導致textView大小變化產生抖動,這里通過設置textView寬度就避免抖動現象
            //1.3f是根據上面字體大小變化的倍數1.3f設置
            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;
        }

    }
    //設置數據源
    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);
      }
    ```

* 如何使用抽取的“滑動標題欄+ViewPager”?  
  直接自定義一個TestFragment繼承自ScrollViewpagerBaseFragment,然后系統會提示你去重寫ScrollViewpagerBaseFragment的抽象方法,然后初始化數據,并將初始化的數據賦值給這兩個方法,就可以使用"滑動標題欄+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;
    }
}

希望能幫到你!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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