Android 滚动Tab

简介:

先看效果:

022236152.gif

如果对效果感兴趣, 请耐心看完, 其实不复杂.

需要android-support-v4.jar的支持.


主布局文件activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
< android.support.v4.view.ViewPager  xmlns:android = "http://schemas.android.com/apk/res/android"
     xmlns:tools = "http://schemas.android.com/tools"
     android:id = "@+id/pager"
     android:layout_width = "match_parent"
     android:layout_height = "match_parent"
     tools:context = ".MainActivity"  >
     < android.support.v4.view.PagerTitleStrip
         android:id = "@+id/pager_title_strip"
         android:layout_width = "match_parent"
         android:layout_height = "wrap_content"
         android:layout_gravity = "top"
         android:background = "#33b5e5"
         android:paddingBottom = "4dp"
         android:paddingTop = "4dp"
         android:textColor = "#fff"  />
</ android.support.v4.view.ViewPager >


主Activity, 核心是给mViewPager设置一个Adapter--mFragmentAdapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public  class  MainActivity  extends  FragmentActivity {
     private  FragmentAdapter mFragmentAdapter;
     private  ViewPager mViewPager;
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         mFragmentAdapter =  new  FragmentAdapter(MainActivity. this , getSupportFragmentManager());
         mViewPager = (ViewPager) findViewById(R.id.pager);
         mViewPager.setAdapter(mFragmentAdapter);
     }
     @Override
     public  boolean  onCreateOptionsMenu(Menu menu) {
         getMenuInflater().inflate(R.menu.main, menu);
         return  true ;
     }
}


接下来看看FragmentAdapter如何实现的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public  class  FragmentAdapter  extends  FragmentPagerAdapter {
     private  Context mContext;
     public  FragmentAdapter(Context context, FragmentManager fm) {
         super (fm);
         mContext = context;
     }
     @Override
     public  Fragment getItem( int  position) {
         Fragment fragment;
         if  (position ==  2 ) {
             fragment =  new  AboutMeFragment();
         else  {
             fragment =  new  TabFragment();
             Bundle args =  new  Bundle();
             args.putInt(TabFragment.TAB_POSITION, position +  1 );
             fragment.setArguments(args);
         }
         return  fragment;
     }
     @Override
     public  int  getCount() {
         return  3 ;
     }
     @Override
     public  CharSequence getPageTitle( int  position) {
         if  (position ==  2 ) {
             return  mContext.getString(R.string.about_me_title);
         else  {
             Locale l = Locale.getDefault();
             return  mContext.getString(R.string.tab_fragment_title, position +  1 ).toUpperCase(l);
         }
     }
}

在getCount()里面设置了3个Tab页, 等position==2的时候也就是最后一个页, 我设置了一个不同于前两个页的about_me页面. 主要是表示: 可以根据需要设置不同类型的Fragment到Adapter里面. 这里两种Fragment分别是TabFragment()和AboutMeFragment()


TabFragment的布局文件只有一个TextView, 就不贴了, 直接看java文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import  android.os.Bundle;
import  android.support.v4.app.Fragment;
import  android.view.LayoutInflater;
import  android.view.View;
import  android.view.ViewGroup;
import  android.widget.TextView;
import  com.lichen.remind.R;
public  class  TabFragment  extends  Fragment {
     public  static  final  String TAB_POSITION =  "tab_position" ;
     public  TabFragment() {
     }
     @Override
     public  View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
         View rootView = inflater.inflate(R.layout.fragment_tab, container,  false );
         TextView tabLabel = (TextView) rootView.findViewById(R.id.tab_label);
         tabLabel.setText(getString(R.string.tab_fragment_content, getArguments().getInt(TAB_POSITION)));
         return  rootView;
     }
}


AboutMeFragment的布局文件fragment_tab.xml, 其实也一个TextView, 不过使用了android:drawableTop=""属性.

1
2
3
4
5
6
7
8
9
10
11
12
<? 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:gravity = "center_horizontal|center_vertical"
     android:orientation = "vertical"  >
     < TextView
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         android:drawableTop = "@drawable/me"
         android:text = "@string/about_me_email" />
</ LinearLayout >

然后是AboutMeFragment.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import  android.os.Bundle;
import  android.support.v4.app.Fragment;
import  android.view.LayoutInflater;
import  android.view.View;
import  android.view.ViewGroup;
import  com.lichen.remind.R;
public  class  AboutMeFragment  extends  Fragment {
     @Override
     public  View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
         View rootView = inflater.inflate(R.layout.fragment_about_me,container,  false );
         return  rootView;
     }
}


资源文件strings.xml中, 使用了传入参数的方式.

1
2
3
4
5
6
7
8
9
<? xml  version = "1.0"  encoding = "utf-8" ?>
< resources  xmlns:xliff = "urn:oasis:names:tc:xliff:document:1.2" >
     < string  name = "app_name" >Remind</ string >
     < string  name = "action_settings" >Settings</ string >
     < string  name = "about_me_title" >关于我</ string >
     < string  name = "about_me_email" >chain_li7@163.com</ string >
     < string  name = "tab_fragment_title" >第 < xliff:g  id = "tab_fragment_title_position" >%1$d</ xliff:g > 个Tab</ string >
     < string  name = "tab_fragment_content" >这是第 < xliff:g  id = "tab_fragment_content_position" >%1$d</ xliff:g > 个Tab页面</ string >
</ resources >


这样就可以看到上图滚动Tab了.



本文转自chainli 51CTO博客,原文链接:http://blog.51cto.com/lichen/1215521,如需转载请自行联系原作者
相关文章
|
2月前
|
XML Java Android开发
Android Studio App开发中改造已有的控件实战(包括自定义支付宝月份选择器、给翻页栏添加新属性、不滚动的列表视图 附源码)
Android Studio App开发中改造已有的控件实战(包括自定义支付宝月份选择器、给翻页栏添加新属性、不滚动的列表视图 附源码)
68 1
|
23天前
|
XML API Android开发
android上FragmentTabHost实现自定义Tab Indicator
android上FragmentTabHost实现自定义Tab Indicator
19 1
|
2月前
|
XML Java Android开发
Android App开发动画特效之利用滚动器实现平滑翻页(附源码和演示 简单易懂)
Android App开发动画特效之利用滚动器实现平滑翻页(附源码和演示 简单易懂)
57 0
Android App开发动画特效之利用滚动器实现平滑翻页(附源码和演示 简单易懂)
|
2月前
|
Android开发 Kotlin
android开发,使用kotlin学习滚动控件RecyclerView
android开发,使用kotlin学习滚动控件RecyclerView
60 0
|
2月前
|
XML Java Android开发
Android Studio App开发中多线程的讲解与实现新闻轮播滚动实战(附源码 超详细必看)
Android Studio App开发中多线程的讲解与实现新闻轮播滚动实战(附源码 超详细必看)
41 0
|
12月前
|
XML Java 程序员
玩转 Android 嵌套滚动
Android 嵌套滚动
127 0
|
Android开发
Android HorizontalScrollView 横向滚动自动居中
Android HorizontalScrollView 横向滚动自动居中
|
Android开发
解决安卓GridView的横向滚动问题
解决安卓GridView的横向滚动问题
132 0
|
Android开发
关于安卓竖直滚动文字自定义控件的探索
安卓竖直滚动文字自定义控件
100 0
关于安卓仿支付宝数字滚动控件的实现
安卓仿支付宝数字滚动控件的实现
283 0