ViewPageIndicator + ViewPager + Fragment实现类似网易新闻客户端Tab标签

1,要想使ViewPageIndicator框架,需要先从github上下载源码,源码地址:https://github.com/JakeWharton/Android-ViewPagerIndicator,把library引入项目中

[java]  view plain copy
  1. package com.sdufe.thea.guo;  
  2.   
  3. import com.sdufe.thea.guo.fragment.IndexFragment;  
  4.   
  5. import android.os.Bundle;  
  6. import android.app.Activity;  
  7. import android.support.v4.app.FragmentActivity;  
  8. import android.view.Menu;  
  9. import android.view.Window;  
  10. import android.widget.LinearLayout;  
  11.   
  12. public class MainActivity extends FragmentActivity {  
  13.   
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.           
  18.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  19.         setContentView(R.layout.activity_main);  
  20.   
  21.         getSupportFragmentManager().beginTransaction()  
  22.                 .add(R.id.ll, new IndexFragment()).commit();  
  23.     }  
  24.   
  25.     @Override  
  26.     public boolean onCreateOptionsMenu(Menu menu) {  
  27.         getMenuInflater().inflate(R.menu.main, menu);  
  28.         return true;  
  29.     }  
  30.   
  31. }  
上面的代码就是在activity里面放入一个fragment,很简单啦,就不解释了.

下面主要就是对于框架的使用了:

[java]  view plain copy
  1. package com.sdufe.thea.guo.fragment;  
  2.   
  3. import com.sdufe.thea.guo.R;  
  4. import com.sdufe.thea.guo.adapter.TabPageIndicatorAdapter;  
  5. import com.viewpagerindicator.TabPageIndicator;  
  6.   
  7. import android.os.Bundle;  
  8. import android.support.v4.app.Fragment;  
  9. import android.support.v4.view.ViewPager;  
  10. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.widget.Toast;  
  15.   
  16. public class IndexFragment extends Fragment {  
  17.   
  18.     private static String[] title = { "呵呵""哈哈""嘿嘿""嗷嗷" };  
  19.     private ViewPager viewPager;  
  20.     private TabPageIndicator indicator;  
  21.     private TabPageIndicatorAdapter adapter;  
  22.   
  23.     @Override  
  24.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  25.             Bundle savedInstanceState) {  
  26.         View view = inflater.inflate(R.layout.fragment_index, null);  
  27.         viewPager = (ViewPager) view.findViewById(R.id.pager);  
  28.         indicator = (TabPageIndicator) view.findViewById(R.id.indicator);  
  29.         adapter = new TabPageIndicatorAdapter(getFragmentManager(), title);  
  30.   
  31.         viewPager.setAdapter(adapter);  
  32.         indicator.setViewPager(viewPager);  
  33.   
  34.         indicator.setOnPageChangeListener(new OnPageChangeListener() {  
  35.   
  36.             @Override  
  37.             public void onPageSelected(int arg0) {  
  38.                 Toast.makeText(getActivity(), title[arg0], Toast.LENGTH_LONG)  
  39.                         .show();  
  40.             }  
  41.   
  42.             @Override  
  43.             public void onPageScrolled(int arg0, float arg1, int arg2) {  
  44.   
  45.             }  
  46.   
  47.             @Override  
  48.             public void onPageScrollStateChanged(int arg0) {  
  49.   
  50.             }  
  51.         });  
  52.         return view;  
  53.     }  
  54. }  
用起来很简单,毕竟都是大神们写的框架,方便我们小菜们使用,主要思路就是初始化viewPager和TabPageIndicator,给viewpager设置适配器.TabPageIndicator跟随viewPager一起滑动,顺便为其设置监听

下面贴一下适配器的代码:

[java]  view plain copy
  1. package com.sdufe.thea.guo.adapter;  
  2.   
  3. import com.sdufe.thea.guo.fragment.ItemFragment;  
  4.   
  5. import android.os.Bundle;  
  6. import android.support.v4.app.Fragment;  
  7. import android.support.v4.app.FragmentManager;  
  8. import android.support.v4.app.FragmentPagerAdapter;  
  9.   
  10. public class TabPageIndicatorAdapter extends FragmentPagerAdapter {  
  11.   
  12.     private  String[] title;  
  13.       
  14.     public TabPageIndicatorAdapter(FragmentManager fm, String[] title) {  
  15.         super(fm);  
  16.         this.title = title;  
  17.     }  
  18.   
  19.     @Override  
  20.     public Fragment getItem(int arg0) {  
  21.         Fragment fragment=new ItemFragment();  
  22.         Bundle bundle=new Bundle();  
  23.         bundle.putString("arg", title[arg0]);  
  24.         fragment.setArguments(bundle);  
  25.         return fragment;  
  26.     }  
  27.   
  28.     @Override  
  29.     public int getCount() {  
  30.         return title.length;  
  31.     }  
  32.   
  33.     @Override  
  34.     public CharSequence getPageTitle(int position) {  
  35.         return title[position%title.length];  
  36.     }  
  37.   
  38. }  
看着很熟悉吧,前面一片文章已经写过viewPager的使用了,这里主要说一下getPageTitle(int position)这个函数,如果你不重写这个函数,tab中就不会出现设置的文字,要想文字出现,必须要重写这个函数

当然如果上面写的内容你全部敲完了也就是能实现滑动,那天跟着跑的线,样式什么的都没有,下面你需要继续敲,这里是通过改变主题来设置的

[html]  view plain copy
  1. <style name="CustomTabPageIndicator" parent="Widget.TabPageIndicator">  
  2.         <item name="android:background">@drawable/tab_indicator</item>  
  3.         <item name="android:textAppearance">@style/CustomTabPageIndicator.Text</item>  
  4.         <item name="android:textSize">14sp</item>  
  5.         <item name="android:dividerPadding">8dp</item>  
  6.         <item name="android:showDividers">middle</item>  
  7.         <item name="android:paddingLeft">10dp</item>  
  8.         <item name="android:paddingRight">10dp</item>  
  9.         <item name="android:fadingEdge">horizontal</item>  
  10.         <item name="android:fadingEdgeLength">8dp</item>  
  11.     </style>  
  12.   
  13.     <style name="CustomTabPageIndicator.Text" parent="android:TextAppearance.Medium">  
  14.         <item name="android:typeface">monospace</item>  
  15.         <item name="android:textColor">@drawable/selector_tabtext</item>  
  16.     </style>  
这里主要就是对背景的设置,对背景的设置,是通过选择器实现的

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   
  4.     <item android:drawable="@android:color/transparent" android:state_pressed="false" android:state_selected="false"></item>  
  5.     <item android:drawable="@android:color/transparent" android:state_pressed="true" android:state_selected="false"></item>  
  6.     <item android:drawable="@drawable/base_tabpager_indicator_selected" android:state_pressed="false" android:state_selected="true"></item>  
  7.     <item android:drawable="@drawable/base_tabpager_indicator_selected" android:state_pressed="true" android:state_selected="true"></item>  
  8.   
  9. </selector>  
这样就能实现你想要的滑动了,主要要改变配置文件中的主题(application中的主题作用于整个app,不是只针对于某个acticity)

注:代码是通过夏神代码改编,开始已附上地址

代码下载地址:http://download.csdn.net/detail/elinavampire/8171355



...................................................................................简单看一下源代码...............................................................................................................


首先看一下TabPageIndicator,继承自HorizontalScrollView,也就是说tab是可以实现横向滑屏

[java]  view plain copy
  1. public class TabPageIndicator extends HorizontalScrollView implements PageIndicator  

继续看里面的代码

[java]  view plain copy
  1. private final OnClickListener mTabClickListener = new OnClickListener() {  
  2.         public void onClick(View view) {  
  3.             TabView tabView = (TabView)view;  
  4.             final int oldSelected = mViewPager.getCurrentItem();  
  5.             final int newSelected = tabView.getIndex();  
  6.             mViewPager.setCurrentItem(newSelected);  
  7.             if (oldSelected == newSelected && mTabReselectedListener != null) {  
  8.                 mTabReselectedListener.onTabReselected(newSelected);  
  9.             }  
  10.         }  
  11.     };  

也就是说它本身就实现了点击功能,它不仅仅是实现滑动,其余的就跟实现自定义控件的内容有些相似了

我们使用的方法中还有setViewPager(viewPager)和setOnPageChangeListener()方法,就简单看一下这部分代码

void setViewPager(ViewPager view);和 void setOnPageChangeListener(ViewPager.OnPageChangeListener listener);是接口PageIndicator的方法,TabPageIndicator在自己的类里面实现了接口里面的方法

[java]  view plain copy
  1. @Override  
  2.    public void setViewPager(ViewPager view) {  
  3.        if (mViewPager == view) {  
  4.            return;  
  5.        }  
  6.        if (mViewPager != null) {  
  7.            mViewPager.setOnPageChangeListener(null);  
  8.        }  
  9.        final PagerAdapter adapter = view.getAdapter();  
  10.        if (adapter == null) {  
  11.            throw new IllegalStateException("ViewPager does not have adapter instance.");  
  12.        }  
  13.        mViewPager = view;  
  14.        view.setOnPageChangeListener(this);  
  15.        notifyDataSetChanged();  
  16.    }  
这个方法是为了Bind the indicator to a ViewPager.

[java]  view plain copy
  1. @Override  
  2.     public void setOnPageChangeListener(OnPageChangeListener listener) {  
  3.         mListener = listener;  
  4.     }  
这个主要就是使用viewPager的监听事件了,其实TabPageIndicator就是一个自定义控件

ok,先到这


你可能感兴趣的:(android,viewpage)