首页 > 代码库 > Android-ViewPagerIndicator框架使用——TabPageIndicator
Android-ViewPagerIndicator框架使用——TabPageIndicator
今天介绍一个常用的框架,一般app都会用到这样的框架,下面就来介绍框架的使用以及样式的修改,那就以我自己写的例子来向大家介绍吧!
首先给出xml ,在相应窗口的布局文件中引入TabPageIndicator,在Android-ViewPagerIndicator项目中有很多的tab的样式,它们对应不同的类。 一般我们都是将Android-ViewPagerIndicator与viewpager组合使用,当我们切换tab的时候下面的viewpager也一起切换。
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="fill_parent" 3 android:layout_height="fill_parent" 4 android:orientation="vertical" > 5 6 <com.viewpagerindicator.TabPageIndicator 7 android:id="@+id/indicator" 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" />10 11 <android.support.v4.view.ViewPager12 android:id="@+id/pager"13 android:layout_width="fill_parent"14 android:layout_height="0dp"15 android:layout_weight="1" />16 </LinearLayout>
然后看看主代码怎么写的:
这是title比较少的情况下,我们都这样写
1 @ContentView(R.layout.activity_telecom_fraud) 2 public class TelecomFraudActivity extends BaseAppActivity{ 3 @ViewInject(R.id.indicator) 4 private TabPageIndicator indicator; 5 @ViewInject(R.id.pager) 6 private ViewPager pager; 7 8 private MyPageAdapter adapter; 9 String []title = {"拉拉","呵呵"};10 @Override11 protected void init() {12 adapter = new MyPageAdapter(getSupportFragmentManager());13 pager.setAdapter(adapter);14 indicator.setViewPager(pager);15 }16 17 class MyPageAdapter extends FragmentPagerAdapter {18 public MyPageAdapter(FragmentManager fm) {19 super(fm);20 }21 22 @Override23 public Fragment getItem(int position) {24 Fragment f;25 if (position %title.length == 0){26 f = TFragment.newInstance();27 }else{28 f = MFragment.newInstance();29 }30 31 return f;32 }33 34 @Override35 public CharSequence getPageTitle(int position) {36 return title[position%title.length].toUpperCase();37 }38 39 @Override40 public int getCount() {41 return title.length;42 }43 }44 }
1 这里面的TFragment.newInstance就是在TFragment中定义的一个静态方法,相当于创建对象实例化2 3 public static TFragment newInstance() {4 TFragment fragment = new TFragment();5 return fragment;6 }
MFragment也一样,这里就不上传代码了
其实一般做app项目时我们一般都是调用接口来获取title的值,这种情况下一般title就比较多,那我们就不可能一一写出其对应的fragment,一般都会采取下面的方式
首先通过接口获取到title
1 private void getType(){ 2 EGRequestParams params=new EGRequestParams(); 3 HttpUtil.postNoProcess((BaseAppActivity) getActivity(), UrlConfig.ZIXUN_TYPE, params, new HttpUtil.Ok() { 4 @Override 5 public void success(String str) { 6 typeList=JSON.parseArray(str); 7 if (typeList.size()>0){ 8 indicator.setVisibility(View.VISIBLE); 9 pagerAdapter = new MyPageAdapter(getChildFragmentManager());10 pager.setAdapter(pagerAdapter);11 indicator.setViewPager(pager);12 indicator.setCurrentItem(positions);13 pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {14 @Override15 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {16 curPosition=position;17 }18 19 @Override20 public void onPageSelected(int position) {21 indicator.onPageSelected(position);22 positions = position;23 }24 25 @Override26 public void onPageScrollStateChanged(int state) {27 28 }29 });30 }31 }32 @Override33 public void complete(String str) {34 35 }36 });37 }
然后通过title的id,position来确定fragment的数据(都是从接口获取的数据)
1 class MyPageAdapter extends FragmentPagerAdapter { 2 public MyPageAdapter(FragmentManager fm) { 3 super(fm); 4 } 5 @Override 6 public Fragment getItem(int position) { 7 FragmentTask f = FragmentTask.newInstance(); 8 Bundle bundle = new Bundle(); 9 bundle.putString("type", ((JSONObject) typeList.get(position)).getString("id"));10 bundle.putString("position", position+"");11 f.setArguments(bundle);12 return f;13 }14 @Override15 public CharSequence getPageTitle(int position) {16 return ((JSONObject)typeList.get(position)).getString("name");17 }18 @Override19 public int getCount() {20 return typeList.size();21 }22 }
FragmentTask 里获取传过去的值
1 Bundle bundle = getArguments(); 2 if (bundle != null){ 3 type = bundle.getString("type"); 4 position= bundle.getString("position"); 5 } 6 7 .......... 8 if (!position.equals(Fragment3.curPosition)){ 9 ZiXunTableView.initLoad();10 }11 12 ........13 EGRequestParams params=new EGRequestParams(); params.addBodyParameter("page",pageIndex+""); params.addBodyParameter("size",pageSize+"");14 params.addBodyParameter("programRefId",type);15 .........
改变tab的样式,我们这边只看TabPageIndicator的样式修改,其他基本类似。我们进入TabPageIndicator的源码在构造函数。
1 public TabPageIndicator(Context context, AttributeSet attrs) { 2 super(context, attrs); 3 setHorizontalScrollBarEnabled(false); 4 mTabLayout = new IcsLinearLayout(context, R.attr.vpiTabPageIndicatorStyle); 5 addView(mTabLayout, new ViewGroup.LayoutParams(WRAP_CONTENT, MATCH_PARENT)); 6 }
我们可以看出TabPageIndicator使用的是vpiTabPageIndicatorStyle样式。我们可以在依赖项目中看到系统自带的样式,在依赖项目的values/vpi_styles.xml文件中,这里面定义了所有tab类型的样式。
1 <style name="Widget.TabPageIndicator" parent="Widget"> 2 <item name="android:gravity">center</item> 3 <item name="android:background">@drawable/vpi__tab_indicator</item> 4 <item name="android:paddingLeft">22dip</item> 5 <item name="android:paddingRight">22dip</item> 6 <item name="android:paddingTop">12dp</item> 7 <item name="android:paddingBottom">12dp</item> 8 <item name="android:textAppearance">@style/TextAppearance.TabPageIndicator</item> 9 <item name="android:textSize">12sp</item> 10 <item name="android:maxLines">1</item> 11 </style>
我们可以根据自己的需要继承这个样式并修改。
到这里基本就OK了。Android-ViewPagerIndicator的集成非常简单的。
Android-ViewPagerIndicator框架使用——TabPageIndicator
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。