Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

来源:互联网 发布:张爱玲小艾 知乎 编辑:程序博客网 时间:2024/06/05 11:18

转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053

之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻客户端Tab标签的功能,ActionBarSherlock是在3.0以下的机器支持ActionBar的功能,有兴趣的可以看看开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端,今天用到的是JakeWharton的另一开源控件ViewPageIndicator,ViewPager想必大家都知道,Indicator指示器的意思,所以ViewPageIndicator就是ViewPager指示器咯,什么是ViewPager指示器呢?看了下面这副图你就明白了


你看明白了没?就是ViewPager的分页指示器,比如很多应用的指引界面,下面的小圆点,还有一些应用上面的Tab等等,ViewPageIndicator都能很好的实现,今天就继续带大家来实现网易新闻的Tab功能

  • 我们先得去Github上面下载这个库,下载地址:https://github.com/JakeWharton/Android-ViewPagerIndicator,下载下来之后你可以运行例子,来看看我们需要什么样的效果,然后在此基础上改成我们自己想要的效果


sample是提供给我们的例子,library是库工程,我们需要将其作为我们自己项目的依赖库,我们新建一个Android工程,将library导入工程我就不介绍了,比较简单相信大家都会,不知道的可以看看我的这篇文章http://blog.csdn.net/xiaanming/article/details/9971721

注:如果你新建的项目libs目录下面有android-support-v4.jar,你要将其删除,因为ViewPageIndicator里面有这个库,我们项目中不允许两个android-support-v4.jar,不删除我们的项目不能编译的

  • 下面我们来介绍主要代码的编写了,先看布局文件,上面一个TabPageIndicator,下面一个ViewPager,还是很简单的布局咯

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <LinearLayout  
  2.     xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent">  
  6.   
  7.     <com.viewpagerindicator.TabPageIndicator  
  8.         android:id="@+id/indicator"  
  9.         android:background="@drawable/base_action_bar_bg"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_width="fill_parent"  
  12.         />  
  13.     <android.support.v4.view.ViewPager  
  14.         android:id="@+id/pager"  
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="0dp"  
  17.         android:layout_weight="1"  
  18.         />  
  19.   
  20. </LinearLayout>  
MainActivity的代码

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. package com.example.viewpageindicator;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.Fragment;  
  5. import android.support.v4.app.FragmentActivity;  
  6. import android.support.v4.app.FragmentManager;  
  7. import android.support.v4.app.FragmentPagerAdapter;  
  8. import android.support.v4.view.ViewPager;  
  9. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  10. import android.widget.Toast;  
  11.   
  12. import com.viewpagerindicator.TabPageIndicator;  
  13.   
  14. public class MainActivity extends FragmentActivity {  
  15.     /** 
  16.      * Tab标题 
  17.      */  
  18.     private static final String[] TITLE = new String[] { "头条""房产""另一面""女人",  
  19.                                                         "财经""数码""情感""科技" };  
  20.   
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.activity_main);  
  25.           
  26.         //ViewPager的adapter  
  27.         FragmentPagerAdapter adapter = new TabPageIndicatorAdapter(getSupportFragmentManager());  
  28.         ViewPager pager = (ViewPager)findViewById(R.id.pager);  
  29.         pager.setAdapter(adapter);  
  30.   
  31.         //实例化TabPageIndicator然后设置ViewPager与之关联  
  32.         TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);  
  33.         indicator.setViewPager(pager);  
  34.           
  35.         //如果我们要对ViewPager设置监听,用indicator设置就行了  
  36.         indicator.setOnPageChangeListener(new OnPageChangeListener() {  
  37.               
  38.             @Override  
  39.             public void onPageSelected(int arg0) {  
  40.                 Toast.makeText(getApplicationContext(), TITLE[arg0], Toast.LENGTH_SHORT).show();  
  41.             }  
  42.               
  43.             @Override  
  44.             public void onPageScrolled(int arg0, float arg1, int arg2) {  
  45.                   
  46.             }  
  47.               
  48.             @Override  
  49.             public void onPageScrollStateChanged(int arg0) {  
  50.                   
  51.             }  
  52.         });  
  53.           
  54.     }  
  55.   
  56.       
  57.     /** 
  58.      * ViewPager适配器 
  59.      * @author len 
  60.      * 
  61.      */  
  62.     class TabPageIndicatorAdapter extends FragmentPagerAdapter {  
  63.         public TabPageIndicatorAdapter(FragmentManager fm) {  
  64.             super(fm);  
  65.         }  
  66.   
  67.         @Override  
  68.         public Fragment getItem(int position) {  
  69.             //新建一个Fragment来展示ViewPager item的内容,并传递参数  
  70.             Fragment fragment = new ItemFragment();    
  71.             Bundle args = new Bundle();    
  72.             args.putString("arg", TITLE[position]);    
  73.             fragment.setArguments(args);    
  74.               
  75.             return fragment;  
  76.         }  
  77.   
  78.         @Override  
  79.         public CharSequence getPageTitle(int position) {  
  80.             return TITLE[position % TITLE.length];  
  81.         }  
  82.   
  83.         @Override  
  84.         public int getCount() {  
  85.             return TITLE.length;  
  86.         }  
  87.     }  
  88.   
  89. }  
我们先实例化ViewPager,然后实例化TabPageIndicator,并且要设置TabPageIndicator和ViewPager关联,就是调用TabPageIndicator的setViewPager(ViewPager view)方法,这样子我们就实现了点击上面的Tab,下面的ViewPager切换,滑动ViewPager上面的Tab跟着切换,ViewPager的每一个Item我们使用的是Fragment,使用Fragment可以使我们的布局更加灵活一点,所以建议大家多用用Fragment,你会发现他真的很好用,上面还有一点需要注意的地方,当我们需要给ViewPager设置监听的时候,我们之前设置OnPageChangeListener直接用ViewPager.setOnPageChangeListener,而现在我们不能这样子了,TabPageIndicator提供了设置OnPageChangeListener的方法,我们需要调用TabPageIndicator.setOnPageChangeListener来设置监听
  •  ViewPager的item,也就是Fragment,我这里只用了一个TextView来显示从MainActivity传递过来的Tab的标题,只是为了模拟平常我们实际使用中,从Activity传递参数给Fragment,布局我就不贴了,代码也比较简单,直接看代码吧

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. package com.example.viewpageindicator;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.Fragment;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.TextView;  
  9.   
  10.   
  11. public class ItemFragment extends Fragment {  
  12.   
  13.     @Override  
  14.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  15.             Bundle savedInstanceState) {  
  16.           
  17.         View contextView = inflater.inflate(R.layout.fragment_item, container, false);  
  18.         TextView mTextView = (TextView) contextView.findViewById(R.id.textview);  
  19.           
  20.         //获取Activity传递过来的参数  
  21.         Bundle mBundle = getArguments();  
  22.         String title = mBundle.getString("arg");  
  23.           
  24.         mTextView.setText(title);  
  25.           
  26.         return contextView;  
  27.     }  
  28.   
  29.     @Override  
  30.     public void onActivityCreated(Bundle savedInstanceState) {  
  31.         super.onActivityCreated(savedInstanceState);  
  32.     }  
  33.   
  34. }  
当然通过上面几步我们还不能对网易新闻的模仿,我们还必须简单修改其样式,有些东西我是直接从开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端拿出来的,不过这里的样式修改比用ViewPageIndicator简单多了,样式如下

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <style name="StyledIndicators" parent="@android:style/Theme.Light">  
  2.     <item name="vpiTabPageIndicatorStyle">@style/CustomTabPageIndicator</item>  
  3. </style>  
  4.   
  5. <style name="CustomTabPageIndicator" parent="Widget.TabPageIndicator">  
  6.     <item name="android:background">@drawable/tab_indicator</item>  
  7.     <item name="android:textAppearance">@style/CustomTabPageIndicator.Text</item>  
  8.     <item name="android:textSize">14sp</item>  
  9.     <item name="android:dividerPadding">8dp</item>  
  10.     <item name="android:showDividers">middle</item>  
  11.     <item name="android:paddingLeft">10dp</item>  
  12.     <item name="android:paddingRight">10dp</item>  
  13.     <item name="android:fadingEdge">horizontal</item>  
  14.     <item name="android:fadingEdgeLength">8dp</item>  
  15. </style>  
  16.   
  17. <style name="CustomTabPageIndicator.Text" parent="android:TextAppearance.Medium">  
  18.     <item name="android:typeface">monospace</item>  
  19.     <item name="android:textColor">@drawable/selector_tabtext</item>  
  20. </style>  
通过上面简单的几步我们就实现了对网易新闻的模仿,接下来我们运行下项目看下效果



总结

ViewPageIndicator实现这样子的Tab标签很容易,而且ViewPageIndicator里面还有各种的指示器,相对于用ActionBarSherlock来实现,ViewPageIndicator更加灵活,而且修改ActionBarSherlock的样式比较复杂,如果你的项目中有用到ActionBarSherlock这个库,你可以使用来实现Tab分页,如果Tab上面还加导航条,ActionBarSherlock只能使用ActionBar来实现咯,而使用ViewPageIndicator我们可以更加灵活的使用自己的布局,我们我还是推荐使用ViewPageIndicator,这只是我的个人观点


项目源码,点击下载



转自:http://blog.csdn.net/xiaanming/article/details/10766053
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子腺样体肥大鼻子堵塞怎么办 孩子初中成绩太差怎么办 交违章罚单丢了怎么办 违章缴费单丢了,怎么办 违章处理单掉了怎么办 驾驶证被扣9分后怎么办 车子违章扣50分怎么办 车子扣了12分怎么办 大学把档案丢了怎么办 学校把档案丢了怎么办 高考考了200多分怎么办 高考报名号忘了怎么办 中考只考500分怎么办 档案自提了之后怎么办 冬天衣服上的毛怎么办 四维预约不上怎么办 交了订金后悔了怎么办 信而富认证失败怎么办 南京市民卡坏了怎么办 南京市民卡断了怎么办 义乌市民卡丢了怎么办 常熟市民卡丢了怎么办 昆山市民卡丢了怎么办 市民卡丢了看病怎么办 儿童市民卡丢了怎么办 眉毛纹的太黑怎么办 法院执行书下了怎么办 汽车临牌过期了怎么办 考试用了hb铅笔怎么办 处对象处的心累怎么办 孩子初中毕业考不上高中怎么办 单位停交社保后怎么办 58同城电话骚扰怎么办 回民误吃了猪肉怎么办 回族人吃了猪肉怎么办 商场倒闭了商铺怎么办 吃了金毓婷出血怎么办 吃过毓婷后怀孕怎么办 新鲜枣子吃多了怎么办 xp系统重启黑屏怎么办 15岁初中生厌学怎么办