Android ViewPager + Fragment 实现滑动标签效果
2015-12-31 15:56
811 查看
一般的Tab标签效果就是点击下方标签,切换上方视图,现在常见的大多不是单独的标签效果,而是滑动标签,即页面可以直接左右滑动切换,也可以通过下方的tab标签点击切换。我分享下自己的学习心得。首先上个效果图:
![](http://img.blog.csdn.net/20151231160038214?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这个页面主要有三部分组成:上方的标题栏,中间一个ViewPager,下方一个Tab标签。
效果实现大体分为以下几步:
1)ViewPager中显示是是fragment,所以创建一个List,并初始化fragment实例,添加进去。
2)初始化ViewPager。因为加载的是fragment,索引适配器需要用FragmentPagerAdapter,并覆写getCount和getItem两个函数。
3)设置tab点击事件,点击时ViewPager显示对应的fragment。
4)设置滑动页面时,改变tab标签显示。
定义一个继承自ViewPager.OnPageChangeListener 的监听器,覆写
onPageSelected 函数
在ViewPager上添加监听器
注意:
1)需添加下面的库
2)创建的fragment 必须都是继承自这个包
MainActivity代码如下:
XML代码如下:
资源包供参考:
这个页面主要有三部分组成:上方的标题栏,中间一个ViewPager,下方一个Tab标签。
效果实现大体分为以下几步:
1)ViewPager中显示是是fragment,所以创建一个List,并初始化fragment实例,添加进去。
homeFragment = new HomeFragment(); meFragment = new MeFragment(); messageFragment = new MessageFragment(); fragments = new ArrayList<>(); fragments.add(homeFragment); fragments.add(messageFragment); fragments.add(meFragment);
2)初始化ViewPager。因为加载的是fragment,索引适配器需要用FragmentPagerAdapter,并覆写getCount和getItem两个函数。
void initViewPager() { viewPager = (ViewPager) findViewById(R.id.viewPager); pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public int getCount() { return fragments.size(); } @Override public Fragment getItem(int position) { return fragments.get(position); } }; viewPager.setAdapter(pagerAdapter); viewPager.addOnPageChangeListener(new MyPageChangeListener()); titleText.setText("首页"); viewPager.setCurrentItem(0); homeLayout.setSelected(true); }
3)设置tab点击事件,点击时ViewPager显示对应的fragment。
public void onClick(View v) { switch (v.getId()) { case R.id.tab_home: viewPager.setCurrentItem(0); break; case R.id.tab_message: viewPager.setCurrentItem(1); break; case R.id.tab_me: viewPager.setCurrentItem(2); break; default: break; } }
4)设置滑动页面时,改变tab标签显示。
定义一个继承自ViewPager.OnPageChangeListener 的监听器,覆写
onPageSelected 函数
private class MyPageChangeListener implements ViewPager.OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int position) { currentItem = position; View[] view = {homeLayout, messageLayout, meLayout}; String[] titles = {"首页","消息","我"}; for(View v : view){ v.setSelected(false); } Log.d(TAG, "onPageSelected.position = " + position); titleText.setText(titles[position]); view[position].setSelected(true); } }
在ViewPager上添加监听器
viewPager.addOnPageChangeListener(new MyPageChangeListener());
注意:
1)需添加下面的库
compile 'com.android.support:appcompat-v7:23.0.0'
2)创建的fragment 必须都是继承自这个包
import android.support.v4.app.Fragment;
MainActivity代码如下:
package com.huiyu.hornsey.fragmentdemo;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends FragmentActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
private Context context;
private Fragment homeFragment, messageFragment, meFragment;
private List<Fragment> fragments;
private LinearLayout homeLayout, messageLayout, meLayout;
private ViewPager viewPager;
private FragmentPagerAdapter pagerAdapter;
private TextView titleText;
private int currentItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initViewPager();
}
void initViewPager() { viewPager = (ViewPager) findViewById(R.id.viewPager); pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public int getCount() { return fragments.size(); } @Override public Fragment getItem(int position) { return fragments.get(position); } }; viewPager.setAdapter(pagerAdapter); viewPager.addOnPageChangeListener(new MyPageChangeListener()); titleText.setText("首页"); viewPager.setCurrentItem(0); homeLayout.setSelected(true); }
private void initView() {
homeFragment = new HomeFragment(); meFragment = new MeFragment(); messageFragment = new MessageFragment(); fragments = new ArrayList<>(); fragments.add(homeFragment); fragments.add(messageFragment); fragments.add(meFragment);
titleText = (TextView) findViewById(R.id.text_title);
homeLayout = (LinearLayout) findViewById(R.id.tab_home);
messageLayout = (LinearLayout) findViewById(R.id.tab_message);
meLayout = (LinearLayout) findViewById(R.id.tab_me);
homeLayout.setOnClickListener(this);
messageLayout.setOnClickListener(this);
meLayout.setOnClickListener(this);
}
@Override
public void onClick(View v) { switch (v.getId()) { case R.id.tab_home: viewPager.setCurrentItem(0); break; case R.id.tab_message: viewPager.setCurrentItem(1); break; case R.id.tab_me: viewPager.setCurrentItem(2); break; default: break; } }
private class MyPageChangeListener implements ViewPager.OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int position) { currentItem = position; View[] view = {homeLayout, messageLayout, meLayout}; String[] titles = {"首页","消息","我"}; for(View v : view){ v.setSelected(false); } Log.d(TAG, "onPageSelected.position = " + position); titleText.setText(titles[position]); view[position].setSelected(true); } }
}
XML代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <RelativeLayout android:id="@+id/top_bar" android:layout_alignParentTop="true" android:layout_width="match_parent" android:layout_height="50dp" android:background="@color/main_color"> <TextView android:id="@+id/text_title" android:text="标题" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout> <LinearLayout android:id="@+id/bottom_bar" android:layout_alignParentBottom="true" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="45dp"> <LinearLayout android:id="@+id/tab_home" android:orientation="vertical" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" > <ImageView android:src="@drawable/tabhome" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:id="@+id/tab_message" android:orientation="vertical" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" > <ImageView android:src="@drawable/taborder" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:id="@+id/tab_me" android:orientation="vertical" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" > <ImageView android:src="@drawable/tabmine" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> <View android:id="@+id/line" android:layout_above="@id/bottom_bar" android:background="@color/main_color" android:layout_width="match_parent" android:layout_height="1dp"/> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_below="@id/top_bar" android:layout_above="@id/line" android:layout_width="match_parent" android:layout_height="wrap_content"/> </RelativeLayout>
资源包供参考:
相关文章推荐
- Android进阶_XML解析pull解析,使用反射
- Android的性能优化方法
- android 实现代码混淆
- Android编程中自定义dialog用法实例
- 源码解析Android中View的measure量算过程
- dos保存adb logcat读取的Android信息
- Android之动画
- Android性能优化的一些总结
- Android开发之旅——Android Studio使用小技巧
- Android BitmapMesh使图片扭曲
- android drawable文件夹放入图片规则
- Android的性能优化
- Android加载Gif图片的一般方法:Movie实现
- android基础:android页面添加滚动条
- 【Android】 加解密算法 HMAC 的使用
- Android编程动态修改RelativeLayout宽高的方法
- Android开发总结笔记 View的绘制机制 3-7
- 我的Android进阶之旅------>经典的大牛博客推荐(排名不分先后)!!
- [Android]日期转换参考
- Android JNI 错误解决方案(1)