原文地址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来实现的更多相关文章

  1. Android Studio 使用ViewPager + Fragment实现滑动菜单Tab效果 --简易版

    描述: 之前有做过一个记账本APP,拿来练手的,做的很简单,是用Eclipse开发的: 最近想把这个APP重新完善一下,添加了一些新的功能,并选用Android Studio来开发: APP已经完善了 ...

  2. android 中的 ViewPager+ Fragment

    android的Viewpager 的各种经常的用法,朋友问我要过,所以就稍微总结一下, ViewPager + Fragment 经常用到  代码是从   actionbarsherlock 中提取 ...

  3. Android之实现ViewPager+Fragment左右滑动

    近期看新闻发现新闻的页面是能够左右滑动的.于是自己就好奇起来了,之前做过ViewPager展示图片,在想怎么载入页面呢?研究了一下.发现就是加入了Fragment,废话不多说,揭秘奥秘的时候到了. 使 ...

  4. Android Tab -- 使用ViewPager、PagerTitleStrip/PagerTabStrip来实现

    原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换:点击标签切换. 代码:https://github.com/l ...

  5. Android Tab -- 使用ViewPager、PagerAdapter来实现

    原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换,自动切换. 代码:https://github.com/ldb ...

  6. Android 代码实现viewPager+fragment 模仿今日头条的顶部导航

    模仿今日头条的顶部导航:    下载地址: http://download.csdn.net/detail/u014608640/9917700 效果图:

  7. android Tab 类型切换界面

    实现方案:viewpager + fragment + FragmentPagerAdapter 效果图: 可以左右滑动切换选项卡,或者点击: 如果想使用fragment的时候又想可以左右滑动,就可以 ...

  8. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

     今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...

  9. Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPager

    action来实现tab标签 并跟fragment结合 因为要写新闻客户端这个tab导航是必须的 这里我写几个小练习,希望大家融会贯通. 1actionbar设置tab +fragment 布局是个l ...

随机推荐

  1. BZOJ4411——[Usaco2016 Feb]Load balancing

    1.题意: 给出N个平面上的点.保证每一个点的坐标都是正奇数. 你要在平面上画两条线,一条是x=a,一条是y=b,且a和b都是偶数. 直线将平面划成4个部分,要求包含点数最多的那个部分点数最少. 2. ...

  2. [HDU3709]Balanced Number

    [HDU3709]Balanced Number 试题描述 A balanced number is a non-negative integer that can be balanced if a ...

  3. static小结

    1.隐藏:编译多个文件时,所有未加static的全局变量.全局函数都具有全局可见性. 如果加了static,就会对其他源文件隐藏,利用这一特性可以在不同文件中定义相同的 变量名或函数名,而不用担心冲突 ...

  4. am335x 虚拟机环境变量的设置及注释

    我用的还是老的Linux3.2.0的内核,只是借用了TI am335x SDK 3.0里面的工具. 首先下载TI官方的SDK,上一章已经安装了一个Ubuntu14.04的虚拟机. TI 最新的SDK下 ...

  5. Linux下编译安装Apache Http Server

    Linux下编译安装Apache Http Server [TOC] 1.下载httpd-2.4.12.tar.bz2 wget http://mirror.bit.edu.cn/apache/htt ...

  6. backbone & django csrf_token的问题

    由于这个加入了token的验证,因此在backbone调用Model/Collection的save时会失败,错误403.(这里不讨论劫持重发的问题) 解决方案是:修改xmlHttpRequest的h ...

  7. MySQL 临时表的使用

    -- step 1.创建临时表,命名为item_orders create temporary table item_orders ( item_id int, orderList ) ) -- st ...

  8. Access an instance through a console

    VNC or SPICE is used to view the console output of an instance, regardless of whether or not the con ...

  9. SharePoint更改密码

    stsadm –o updatefarmcredentials –userlogin DomainName\UserName -password NewPassword –local  1. 通过管理 ...

  10. CEF3开发者系列之类和接口

    CEF3基本的框架包含C/C++程 序接口,通过本地库的接口来实现,而这个库则会隔离宿主程序和 Chromium&Webkit的操作细节.它在浏览器控件和宿主程序之间提供紧密的整合,它支持用户 ...