Android Tab -- 使用ViewPager、Fragment、FragmentPagerAdapter来实现
原文地址:http://blog.csdn.net/crazy1235/article/details/42678877
效果:滑动切换;点击标签切换。

代码:https://github.com/ldb-github/Layout_Tab
1、布局:使用LinearLayout布置标签;再使用ViewPager来布置Fragment;使用ImageView作为指示器。
<?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:orientation="vertical"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="36dp"
android:orientation="horizontal"
android:weightSum="3"> <TextView
android:id="@+id/tab1_tv"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="选项卡一"
android:textColor="#707070"/> <TextView
android:id="@+id/tab2_tv"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="选项卡二"
android:textColor="#707070"/> <TextView
android:id="@+id/tab3_tv"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="选项卡三"
android:textColor="#707070"/>
</LinearLayout> <ImageView
android:id="@+id/cursor"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
android:src="@drawable/down_line"/> <android.support.v4.view.ViewPager
android:id="@+id/third_vp"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>
viewpager_fragmentpageradapter.xml
1、实现View.OnClickLinstener接口,在onClick方法中完成点击标签进行切换的功能:调用ViewPager的setCurrentItem()方法。
2、实现ViewPager.OnPageChangeListener方法,在onPageScrolled方法中,改变指示器的位置。
3、在原文的基础上:
a、去掉screen1_3(屏幕宽度的三分之一);增加tabCount(tab的数量)和widthOfOneTab(一个tab的宽度 screenWidth / tabCount)。
b、调整onPageScrolled方法,使其更具通用性。
public class ViewPagerAndFragmentPagerAdapterActivity extends FragmentActivity
implements View.OnClickListener, ViewPager.OnPageChangeListener{ private static final String LOG_TAG =
ViewPagerAndFragmentPagerAdapterActivity.class.getSimpleName(); // 三个textview
private TextView tab1Tv, tab2Tv, tab3Tv;
// 指示器
private ImageView cursorImg;
// viewPager
private ViewPager viewPager;
// fragment对象集合
private ArrayList<Fragment> fragmentsList;
// 记录当前选中的tab的index
private int currentIndex = 0;
// 指示器的偏移量
private int offset = 0;
// 左margin
private int leftMargin = 0;
// 屏幕宽度
private int screenWidth = 0;
// 屏幕宽度的三分之一
//private int screen1_3;
// Tab的数量
private int tabCount;
// 一个Tab的宽度 screenWidth / tabCount
private int widthOfOneTab;
//
private LinearLayout.LayoutParams lp; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewpager_fragmentpageradapter); init();
} /**
* 初始化操作
*/
private void init(){
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels; cursorImg = (ImageView) findViewById(R.id.cursor);
lp = (LinearLayout.LayoutParams) cursorImg.getLayoutParams();
leftMargin = lp.leftMargin; tab1Tv = (TextView) findViewById(R.id.tab1_tv);
tab2Tv = (TextView) findViewById(R.id.tab2_tv);
tab3Tv = (TextView) findViewById(R.id.tab3_tv); tabCount = 3;
widthOfOneTab = screenWidth / tabCount; tab1Tv.setOnClickListener(this);
tab2Tv.setOnClickListener(this);
tab3Tv.setOnClickListener(this); initViewPager();
} private void initViewPager(){
viewPager = (ViewPager) findViewById(R.id.third_vp);
fragmentsList = new ArrayList<>();
Fragment fragment = new FragmentAndFManager_Fragment1();
fragmentsList.add(fragment);
fragment = new FragmentAndFManager_Fragment2();
fragmentsList.add(fragment);
fragment = new FragmentAndFManager_Fragment3();
fragmentsList.add(fragment); viewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), fragmentsList));
viewPager.setCurrentItem(0);
viewPager.setOnPageChangeListener(this);
} @Override
public void onClick(View v) {
Log.d(LOG_TAG, "In onClick v.getId() = " + v.getId());
switch(v.getId()){
case R.id.tab1_tv:
viewPager.setCurrentItem(0);
break;
case R.id.tab2_tv:
viewPager.setCurrentItem(1);
break;
case R.id.tab3_tv:
viewPager.setCurrentItem(2);
break;
}
} @Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
offset = (widthOfOneTab - cursorImg.getLayoutParams().width) / 2;
Log.d(LOG_TAG, "In onPageScrolled: " + position + " -- " + positionOffset + " -- " +
positionOffsetPixels);
//final float scale = getResources().getDisplayMetrics().density;
// if(position == 0){
// lp.leftMargin = (int) (positionOffsetPixels / 3) + offset;
// }else if(position == 1){
// lp.leftMargin = (int) (positionOffsetPixels / 3) + widthOfOneTab + offset;
// } if(position < tabCount - 1){
lp.leftMargin = (int) (positionOffsetPixels / tabCount) + widthOfOneTab * position + offset;
} cursorImg.setLayoutParams(lp);
currentIndex = position;
} @Override
public void onPageSelected(int position) { } @Override
public void onPageScrollStateChanged(int state) { }
}
ViewPagerAndFragmentPagerAdapterActivity.java
1、自定义类FragmentAdapter继承FragmentPagerAdapter,实现方法getItem()和getCount()。
2、通过ArrayList<Fragmet>来保存适配器绑定的Fragment集合。
public class FragmentAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> list;
public FragmentAdapter(FragmentManager fm, ArrayList<Fragment> list) {
super(fm);
this.list = list;
}
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
}
FragmentAdapter.java
Android Tab -- 使用ViewPager、Fragment、FragmentPagerAdapter来实现的更多相关文章
- Android Studio 使用ViewPager + Fragment实现滑动菜单Tab效果 --简易版
描述: 之前有做过一个记账本APP,拿来练手的,做的很简单,是用Eclipse开发的: 最近想把这个APP重新完善一下,添加了一些新的功能,并选用Android Studio来开发: APP已经完善了 ...
- android 中的 ViewPager+ Fragment
android的Viewpager 的各种经常的用法,朋友问我要过,所以就稍微总结一下, ViewPager + Fragment 经常用到 代码是从 actionbarsherlock 中提取 ...
- Android之实现ViewPager+Fragment左右滑动
近期看新闻发现新闻的页面是能够左右滑动的.于是自己就好奇起来了,之前做过ViewPager展示图片,在想怎么载入页面呢?研究了一下.发现就是加入了Fragment,废话不多说,揭秘奥秘的时候到了. 使 ...
- Android Tab -- 使用ViewPager、PagerTitleStrip/PagerTabStrip来实现
原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换:点击标签切换. 代码:https://github.com/l ...
- Android Tab -- 使用ViewPager、PagerAdapter来实现
原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换,自动切换. 代码:https://github.com/ldb ...
- Android 代码实现viewPager+fragment 模仿今日头条的顶部导航
模仿今日头条的顶部导航: 下载地址: http://download.csdn.net/detail/u014608640/9917700 效果图:
- android Tab 类型切换界面
实现方案:viewpager + fragment + FragmentPagerAdapter 效果图: 可以左右滑动切换选项卡,或者点击: 如果想使用fragment的时候又想可以左右滑动,就可以 ...
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...
- Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPager
action来实现tab标签 并跟fragment结合 因为要写新闻客户端这个tab导航是必须的 这里我写几个小练习,希望大家融会贯通. 1actionbar设置tab +fragment 布局是个l ...
随机推荐
- Merge k Sorted Lists Leetcode Java
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 使 ...
- [BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划
[BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划 试题描述 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− ...
- iOS的内购
内购: 向苹果付钱购买与APP的使用相关的产品(游戏中的道具,装备等): 苹果将收到的钱按比例,转给APP方: 不同于APP中的第三方支付(不经过苹果):
- 学号160809224姓名黄家帅c语言程序设计实验2 选择结构程序设计
实验2-1 输入3个数,并按由大到小的顺序输出. 实验要求: 编写一个C程序,输入3个数,并按由大到小的顺序输出. 源码: #include <stdio.h>void main(){ i ...
- eclipse中整合springMvc,velocity和sitemesh
1.项目所需要jar包 (有些可能多余) 2.创建UserController 目录如下: package qust.thb.usermanage.controller; import org.s ...
- ndk学习6: 使用gdb调试ndk程序一
生成debug版程序 方法一: 使用ndk-build编译时,加上如下参数NDK_DEBUG=1,之后生成so文件之外,还会生成gdbobserver,gdb.setup调式文件 方法二: 修改A ...
- 应用HTK搭建语音拨号系统2:创建单音素HMM模型
选自:http://maotong.blog.hexun.com/6204849_d.html 苏统华 哈尔滨工业大学人工智能研究室 2006年10月30日 声明:版权所有,转载请注明作者和来源 该系 ...
- 解决Python往MySQL插入中文时报错的问题
今天遇到一个问题,用Python往MySQL插入数据时,若数据中包含中文会报类似下面的错误: ERROR 1366: Incorrect string value: '\xE4\xB8\xAD\xE5 ...
- struts2 基础demo1
我们都知道 struts2 是基于webframework 出现的 优秀的mvc 框架, 他和struts1 完全没有联系.struts2 是一个框架, 啥叫框架呢?是一个优秀的半成品 . web的框 ...
- ios Tabbar Item 的图标
1,tabBarItem图片的推荐尺寸和最大支持尺寸 下面是标签栏(UITabBar)中tab按钮图标分别在1x.2x.3x下不会压缩变形的尺寸: @1x : 推荐 25 x 25 (最大: 48 ...