1.示例

2.代码

2.1 TabViewPagerMain.java

 import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView; import com.txw.e.viewpager.R; public class TabViewPagerMain extends Fragment { //1,在layout.xml中添加 ViewPagerFragment,它可以是顶级布局,如下:
/*
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPagerFragment
android:id="@+id/state_view_pager"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
*/ //2,准备变量,ViewPager和 PagerAdapter
ViewPager pager;
TabViewPagerAdapter pagerAdapter; //3,初始化pager
void initPager(View v){
//从layout.xml中初始化pager
pager = (ViewPager) v.findViewById(R.id.tab_view_pager); //初始化page adapter
pagerAdapter = new TabViewPagerAdapter(getFragmentManager()); //设置adapter
pager.setAdapter(pagerAdapter); //设置page切换监听者
pager.addOnPageChangeListener(pageChangeListener); //设置pager切换动画
// pager.setPageTransformer(true, new DepthPageTransformer());
} //4,处理 pager 切换事件 /**
* This method will be invoked when the current page is scrolled, either as
* part of a programmatically initiated smooth scroll or a user initiated
* touch scroll.
*
* @param position
* Position index of the first page currently being displayed.
* Page position+1 will be visible if positionOffset is nonzero.
* 当positionOffset不为0时,就说明有划动,这时屏幕会同时显示两个page,各显示一部分。
* 这时position就是第一个page的下标。
* @param positionOffset
* Value from [0, 1) indicating the offset from the page at position.
* 是当前页面滑动比例,如果页面向左翻动,这个值不断变大,最后在趋近1的情况后突变为0。
* 如果页面向右翻动,这个值不断变小,最后变为0。
* 当前屏幕上显示的两个page中第一个page相对于屏幕中间偏移量,如果越小说明越近中心,说明第1个page向右移动。
* 越大说明第1个page正在远离中心。就是向左移动。
* @param positionOffsetPixels
* Value in pixels indicating the offset from position.
*/
/* */
ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
System.out.print("onPageScrolled : ");
System.out.print("position " + position);
System.out.print("\tpositionOffset " + positionOffset);
System.out.println("\tpositionOffsetPixels " + positionOffsetPixels);
if (positionOffset != ){
View lTab = tabWidget.getChildAt(position);
View rTab = tabWidget.getChildAt(position + ); lTab.setSelected(true);
rTab.setSelected(true); lTab.setAlpha(1.35f - positionOffset);
rTab.setAlpha(positionOffset + 0.35f);
}else{
for (int i = ; i < tabWidget.getChildCount() ; ++i){
View tab = tabWidget.getChildAt(i);
tab.setAlpha(1.0f);
if (i == position){
tab.setSelected(true);
}else{
tab.setSelected(false);
}
}
}
}
/**
* This method will be invoked when a new page becomes selected. Animation
* is not necessarily complete.
*
* @param position
* Position index of the new selected page.
*/
// 一个新页被调用时执行,仍为原来的page时,该方法不被调用
@Override
public void onPageSelected(int position) {
System.out.println("onPageSelected " + position); } /**
* Called when the scroll state changes. Useful for discovering when the
* user begins dragging, when the pager is automatically settling to the
* current page, or when it is fully stopped/idle.
*
* @param state
* The new scroll state.
* @see ViewPager#SCROLL_STATE_IDLE
* @see ViewPager#SCROLL_STATE_DRAGGING
* @see ViewPager#SCROLL_STATE_SETTLING
*/
/*
* SCROLL_STATE_IDLE: pager处于空闲状态
* SCROLL_STATE_DRAGGING: pager处于正在拖拽中
* SCROLL_STATE_SETTLING: pager正在自动沉降,相当于松手后,pager恢复到一个完整pager的过程
*/
@Override
public void onPageScrollStateChanged(int state) {
System.out.println("onPageScrollStateChanged " + state);
}
}; //5,重写切换动画类,可以把这个类放到外面去。
public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f; public void transformPage(View view, float position) {
int pageWidth = view.getWidth(); if (position < -) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(); } else if (position <= ) { // [-1,0]
// Use the default slide transition when moving to the left page
view.setAlpha();
view.setTranslationX();
view.setScaleX();
view.setScaleY(); } else if (position <= ) { // (0,1]
// Fade the page out.
view.setAlpha( - position); // Counteract the default slide transition
view.setTranslationX(pageWidth * -position); // Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ ( - MIN_SCALE) * ( - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor); } else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha();
}
}
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_tab_pager_main, container, false); initPager(v); initTabWidget(v); return v;
} //初始化tab栏
void initTabWidget(View v){
tabWidget = (LinearLayout) v.findViewById(R.id.tab_widget);
tab0 = (TextView) tabWidget.findViewById(R.id.tab0);
tab1 = (TextView) tabWidget.findViewById(R.id.tab1);
tab2 = (TextView) tabWidget.findViewById(R.id.tab2);
tab3 = (TextView) tabWidget.findViewById(R.id.tab3); Drawable top ;
top = tab0.getResources().getDrawable(R.drawable.tab_session_state);
top.setBounds(, , , );
tab0.setCompoundDrawables(null,top,null,null); top = tab0.getResources().getDrawable(R.drawable.tab_contacts_state);
top.setBounds(, , , );
tab1.setCompoundDrawables(null,top,null,null); top = tab0.getResources().getDrawable(R.drawable.tab_discovery_state);
top.setBounds(,,,);
tab2.setCompoundDrawables(null,top,null,null); top = tab0.getResources().getDrawable(R.drawable.tab_personal_state);
top.setBounds(,,,);
tab3.setCompoundDrawables(null,top,null,null); tab0.setOnClickListener(clickListener);
tab1.setOnClickListener(clickListener);
tab2.setOnClickListener(clickListener);
tab3.setOnClickListener(clickListener);
} //下面是tab栏及它的事件
LinearLayout tabWidget;
TextView tab1,tab2,tab3,tab0; //tab 栏事件
View.OnClickListener clickListener = new View.OnClickListener() { @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tab0:
pager.setCurrentItem(, false);
break;
case R.id.tab1:
pager.setCurrentItem(, false);
break;
case R.id.tab2:
pager.setCurrentItem(, false);
break;
case R.id.tab3:
pager.setCurrentItem(, false);
break;
}
}
}; }

2.2 TabViewPagerAdapter.java

 import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter; public class TabViewPagerAdapter extends FragmentPagerAdapter{ SessionTab sessionTab;
ContactsTab contactsTab;
DiscoveryTab discoveryTab;
PersonalTab personalTab;
public TabViewPagerAdapter(FragmentManager fm) {
super(fm);
} @Override
public Fragment getItem(int position) { switch (position){
case :if (sessionTab == null) sessionTab = new SessionTab(); return sessionTab;
case :if (contactsTab == null) contactsTab = new ContactsTab(); return contactsTab;
case :if (discoveryTab == null) discoveryTab = new DiscoveryTab(); return discoveryTab;
case :if (personalTab == null) personalTab = new PersonalTab(); return personalTab;
}
return null;
} @Override
public int getCount() {
return ;
}
}

2.4 SessionTab.java

 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.ArrayAdapter;
import android.widget.ListView; import com.txw.e.viewpager.R; import java.util.ArrayList; public class SessionTab extends Fragment { ListView listView;
ArrayAdapter<String> adapter;
ArrayList<String> items; void init(){
items = new ArrayList<>();
for (int i = ; i < ; ++i){
items.add("session " + i);
}
adapter = new ArrayAdapter<>(listView.getContext(),android.R.layout.simple_list_item_1,android.R.id.text1,items); listView.setAdapter(adapter);
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment View v = inflater.inflate(R.layout.fragment_session_tab, container, false);
listView = (ListView) v.findViewById(R.id.session_list); init(); return v;
} }

2.5 ContactsTab.java

 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.ArrayAdapter;
import android.widget.ListView; import com.txw.e.viewpager.R; import java.util.ArrayList; public class ContactsTab extends Fragment { ListView listView;
ArrayAdapter<String> adapter;
ArrayList<String> items; void init(){
items = new ArrayList<>();
for (int i = ; i < ; ++i){
items.add("contact " + i);
}
adapter = new ArrayAdapter<>(listView.getContext(),android.R.layout.simple_list_item_1,android.R.id.text1,items); listView.setAdapter(adapter);
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment View v = inflater.inflate(R.layout.fragment_contacts_tab, container, false);
listView = (ListView) v.findViewById(R.id.contact_list); init(); return v;
} }

2.6 DiscoveryTab.java

 import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; import com.txw.e.viewpager.R; public class DiscoveryTab extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_discovery_tab, container, false);
} }

2.7 PersonalTab.java

 import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; import com.txw.e.viewpager.R; public class PersonalTab extends Fragment { public PersonalTab() {
// Required empty public constructor
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_personal_tab, container, false);
} }

3.xml

3.1 fragment_tab_pager_main.xml

 <?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:background="#FFFFFF"
android:orientation="vertical"
android:id="@+id/pager_layout"
> <android.support.v4.view.ViewPager
android:id="@+id/tab_view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/> <LinearLayout
android:id="@+id/tab_widget"
android:layout_gravity="bottom"
android:orientation="horizontal"
android:background="#d1d1d1"
android:padding="3dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"> <TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="微信"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:gravity="center_horizontal|center_vertical"
android:id="@+id/tab0"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="联系人"
android:layout_gravity="center_vertical"
android:gravity="center_horizontal|center_vertical"
android:id="@+id/tab1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="发现"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:gravity="center_horizontal|center_vertical"
android:id="@+id/tab2"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="我"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:gravity="center_horizontal|center_vertical"
android:id="@+id/tab3"/> </LinearLayout> </LinearLayout>

3.2 fragment_session_tab.xml

 <LinearLayout 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"
android:orientation="vertical"
tools:context=".TabViewPager.SessionTab"
android:background="#FFFFFF">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:text="session"/>
<ListView
android:id="@+id/session_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/> </LinearLayout>

3.3 fragment_contacts_tab.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent" android:background="#FFFFFF"
tools:context="com.txw.e.viewpager.TabViewPager.ContactsTab"> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:text="contacts"/>
<ListView
android:id="@+id/contact_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/> </LinearLayout>

3.4 fragment_discovery_tab.xml

 <LinearLayout 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"
android:orientation="vertical"
android:background="#FFFFFF"
tools:context="com.txw.e.viewpager.TabViewPager.DiscoveryTab"> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal|center_vertical"
android:text="discovery"/> <AnalogClock
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/analogClock"
android:layout_gravity="center_horizontal|center_vertical"/> <Chronometer
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/chronometer"
android:layout_gravity="center_horizontal"/> </LinearLayout>

3.5 fragment_personal_tab.xml

 <ScrollView 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"
android:background="#FFFFFF"
> <LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context="com.txw.e.viewpager.TabViewPager.PersonalTab"> <!-- TODO: Update blank fragment layout --> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:text="personal"/> <DatePicker
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/datePicker"/> </LinearLayout>
</ScrollView>

ViewPager(3)用viewpager实现tabhost的更多相关文章

  1. Android ViewPager 里有子ViewPager的事件冲突

    在Android应用中有时候要用到类似网易新闻左右滑动页面且页面里又有左右滑动的图片功能,我不知道网易是怎么实现的,本人的做法是外面的BaseFragmentActivity布局就是TabViewPa ...

  2. 【Android开发日记】之入门篇(十五)——ViewPager+自定义无限ViewPager

    ViewPager 在 Android 控件中,ViewPager 一直算是使用率比较高的控件,包括首页的banner,tab页的切换都能见到ViewPager的身影. viewpager 来源自 v ...

  3. andorid自己定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager

    近期的项目中,有一个需求要用ViewPager中嵌套ViewPager去实现整个效果.没做不论什么处理做出来后,仅仅能不停的滑动子ViewPager,父ViewPager就无法滑动了,这样肯定是不满足 ...

  4. 【原创】【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

    ViewPager中切换界面Fragment被销毁的问题分析   1.使用场景 ViewPager+Fragment实现界面切换,界面数量>=3   2.Fragment生命周期以及与Activ ...

  5. 自定义的带tab的可左右滑动的viewpager之二viewpager与fragment不兼容

    总的来说,这个TAB用起来还算方便吧 不过随着用的地方多起来,发现了一些问题,比如下面这个界面: TAB1和TAB2都是表单,保存按钮对两个TAB都有效:若当前显示TAB1,点击保存则保存TAB1的f ...

  6. 转载【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

    ViewPager中切换界面Fragment被销毁的问题分析  原文链接 http://www.cnblogs.com/monodin/p/3866441.html 1.使用场景 ViewPager+ ...

  7. 解决Fragment中使用ViewPager时,ViewPager里的Fragment错位和空白问题

    这两天开始在改OSChina的开源android客户端,打算用Fragment来分离Main这个Activity里的功能.用Fragment嵌套ViewPager+Fragment的时候发现问题. 红 ...

  8. ViewPager嵌套ViewPager后子ViewPager滑动不正常问题

    ViewPager嵌套ViewPager后,滑动事件没法在子ViewPager里面响应. 解决办法是自定义子ViewPager. 以下代码是转载的,经本人测试,可以用!!! 转载地址:http://b ...

  9. ViewPager(4)用viewpager实现splash view

    1,示例 2,代码 SplashMain.java import android.os.Bundle; import android.support.v4.app.Fragment; import a ...

随机推荐

  1. 【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates

    IntelliJ IDEA是一款非常优秀的JAVA编辑器,初学都可会对其中的一些做法感到很别扭,刚开始用的时候我也感到很不习惯,在参考了网上一些文章后在这里把我的一些经验写出来,希望初学者能快速适应它 ...

  2. Ubuntu 12.04 之 LAMP

    搭建LAMP环境 (1)更新软件列表: sudo apt-get update 结果报错: W: 无法下载 bzip2:/var/lib/apt/lists/partial/cn.archive.ub ...

  3. [bzoj3489]A simple rmq problem_KD-Tree

    A simple rmq problem 题目大意:给定一个长度为$n$的序列,给出$m$个询问:在$[l,r]$之间找到一个在这个区间里只出现过一次的最大的数. 注释:$1\le n\le 10^5 ...

  4. 【转】关于easyui tab 加载 js ajax 不走后台的问题, 怕找不到 以防万一

    一直以来群里里面很多人反应,在用tab加载界面的时候,界面里面的js不会执行.今天在此说明一下原因. 不管是window,dailog还是tab其实质最终都是继承了panel.panel有两种方式展示 ...

  5. Ubuntu 16.04安装QtCharts时报错:'qtConfig' is not a recognized test function.

    错误: 'qtConfig' is not a recognized test function. 解决方法: 其实5.9分支的版本有问题,转成5.7分支即可. git clone https://g ...

  6. Python进阶系列之怎么写出pythonic的代码

    使用 in/not in 检查key是否存在于字典中 判断某个key是否存在于字典中时,一般的初学者想到的方法是,先以列表的形式把字典所有的key返回,在判断该key是否存在于key列表中 d = { ...

  7. UVa 10534 Wavio Sequence (最长递增子序列 DP 二分)

    Wavio Sequence  Wavio is a sequence of integers. It has some interesting properties. ·  Wavio is of ...

  8. 杭电 3555 Bomb

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  9. WebForms UnobtrusiveValidationMode 须要“jquery”ScriptResourceMapping。

    一.问题产生的背景: 在敲牛腩新闻公布系统的后台登录页面的时候,我们用到了RequiredFieldValidator控件(验证非空控件),该控件的作用是禁止输入规定的内容,RequiredField ...

  10. android XXXActivity和getApplicationContext()差别

    从接触android起,到处都能看到context(上下文)的身影,查看源代码之后你会发现,它仅仅是个抽象类,详细实现都在ContextWrapper实现. 当你去查看android的源代码时,你会发 ...