zoukankan      html  css  js  c++  java
  • Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻clientTab标签

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


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


    sample是提供给我们的样例。library是库project,我们须要将其作为我们自己项目的依赖库。我们新建一个Androidproject,将library导入project我就不介绍了。比較简单相信大家都会,不知道的能够看看我的这篇文章http://blog.csdn.net/xiaanming/article/details/9971721

    注:假设你新建的项目libs文件夹以下有android-support-v4.jar。你要将其删除,由于ViewPageIndicator里面有这个库,我们项目中不同意两个android-support-v4.jar,不删除我们的项目不能编译的

    • 以下我们来介绍主要代码的编写了,先看布局文件。上面一个TabPageIndicator,以下一个ViewPager。还是非常easy的布局咯

    [html] view plaincopy在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 plaincopy在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 plaincopy在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 仿网易新闻client拿出来的。只是这里的样式改动比用ViewPageIndicator简单多了。样式例如以下

    [html] view plaincopy在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标签非常easy。并且ViewPageIndicator里面还有各种的指示器,相对于用ActionBarSherlock来实现,ViewPageIndicator更加灵活。并且改动ActionBarSherlock的样式比較复杂,假设你的项目中实用到ActionBarSherlock这个库,你能够使用来实现Tab分页,假设Tab上面还加导航条。ActionBarSherlock仅仅能使用ActionBar来实现咯,而使用ViewPageIndicator我们能够更加灵活的使用自己的布局,我们我还是推荐使用ViewPageIndicator。这仅仅是我的个人观点


  • 相关阅读:
    Flutter form 的表单 input
    FloatingActionButton 实现类似 闲鱼 App 底部导航凸起按钮
    Flutter 中的常见的按钮组件 以及自 定义按钮组件
    Drawer 侧边栏、以及侧边栏内 容布局
    AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar
    清空路由 路由替换 返回到根路由
    应对ubuntu linux图形界面卡住的方法
    [转] 一块赚零花钱
    [转]在树莓派上搭建LAMP服务
    ssh保持连接
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6874764.html
Copyright © 2011-2022 走看看