Android入门(33)——第十章 使用ViewPager实现导航
来源:互联网 发布:mac 当前路径命令 编辑:程序博客网 时间:2024/05/06 03:42
第一部分:
1. 效果图:聊天、发现、通讯录。
ViewPager是一种容器,里面可以包含两种东西,一种是View的对象,一种是Fragment。
2. 加入ViewPager:
3. 加载显示的页卡:
4. 配置适配器Adapter:
第二部分:
5. 案例:做一个四个页面的滑动:
第一步:创建四个布局页面,分别叫view1、view2、view3和view4.下面是view1.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:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第一个界面"/> </LinearLayout>第二步:配置适配器PagerAdapter,我们新建一个MyPagerAdapter.java文件来继承实现PagerAdapter。页卡就代表着页面。
package com.example.viewpager;import java.util.List;import android.support.v4.view.PagerAdapter;import android.view.View;import android.view.ViewGroup;public class MyPagerAdapter extends PagerAdapter{private List<View> viewList;public MyPagerAdapter(List<View> viewList){this.viewList = viewList;// 构造函数,用来获取数据源}/* * 返回的是页卡的数量 * */@Overridepublic int getCount() {// TODO Auto-generated method stubreturn viewList.size();}/* * 判断当前View是否来自于对象 * */@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0 == arg1;// 官方文档}/* * 实例化一个页卡 * */@Overridepublic Object instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubcontainer.addView(viewList.get(position));return viewList.get(position);}/* * 销毁一个页卡 * */@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// TODO Auto-generated method stubcontainer.removeView(viewList.get(position));}}第三步:创建MainActivity的Activity,用来实现ViewPager:
package com.example.viewpager;import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.app.Activity;import android.support.v4.view.ViewPager;import android.view.Menu;import android.view.View;public class MainActivity extends Activity {private List<View> viewList;private ViewPager pager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* * 通过View对象作为ViewPager的数据源 * */ // 先新建一个ViewList集合 viewList = new ArrayList<View>(); // 将布局转成View对象: View view1 = View.inflate(this, R.layout.view1, null); View view2 = View.inflate(this, R.layout.view2, null); View view3 = View.inflate(this, R.layout.view3, null); View view4 = View.inflate(this, R.layout.view4, null); // 将上面的View对象加入到ViewList集合中: viewList.add(view1); viewList.add(view2); viewList.add(view3); viewList.add(view4); /* * 配置适配器,如果数据源是List<View>的话,适配器用PagerAdapter。 * */ // 初始化ViewPager pager = (ViewPager) findViewById(R.id.pager); // 创建PagerAdapter的适配器,适配器先获取数据源,然后由ViewPager加载该适配器。 MyPagerAdapter adapter = new MyPagerAdapter(viewList); // ViewPager加载适配器 pager.setAdapter(adapter); }}效果图:没什么特别之处,就是可以左右滑动,一共四个页面。
6. 案例二:添加标题:
第一步:改写main页面布局:在ViewPager中添加<android.support.v4.view.PagerTabStrip>控件,id为tab:
<?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" > <android.support.v4.view.ViewPager android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:id="@+id/pager" > <android.support.v4.view.PagerTabStrip android:id="@+id/tab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top"> </android.support.v4.view.PagerTabStrip> </android.support.v4.view.ViewPager> </LinearLayout>第二步:改写适配器文件MyPagerAdapter,让构造函数可以接收titleList,同时添加方法getPageTitle用来设置ViewPager页卡的标题:
package com.example.viewpager;import java.util.List;import android.support.v4.view.PagerAdapter;import android.view.View;import android.view.ViewGroup;public class MyPagerAdapter extends PagerAdapter {private List<View> viewList;private List<String> titleList;public MyPagerAdapter(List<View> viewList, List<String> titleList) {this.viewList = viewList; // 构造函数this.titleList = titleList;}/* * 返回的是页卡的数量 */@Overridepublic int getCount() {// TODO Auto-generated method stubreturn viewList.size();}/* * 判断当前View是否来自于对象 */@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0 == arg1; // 官方文档}/* * 实例化一个页卡 */@Overridepublic Object instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubcontainer.addView(viewList.get(position));return viewList.get(position);}/* * 销毁一个页卡 */@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// TODO Auto-generated method stubcontainer.removeView(viewList.get(position));}/* * 设置ViewPager页卡的标题,获取标题,有标题的前提是必须要在ViewPager布局中加入android.support.v4.view. * PagerTabStrip控件。 */@Overridepublic CharSequence getPageTitle(int position) {// TODO Auto-generated method stubreturn titleList.get(position);}}第三步:改写MainActivity的活动文件,为ViewPager页卡设置标题内容,为PagerTabStrip设置一些颜色格式属性,因为tab是设置在ViewPager布局里面的,所以这里不需要有语句进行特殊的关联,只需要设置属性即可。
package com.example.viewpager;import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.app.Activity;import android.graphics.Color;import android.support.v4.view.PagerTabStrip;import android.support.v4.view.ViewPager;import android.view.Menu;import android.view.View;public class MainActivity extends Activity {private List<View> viewList;private ViewPager pager;private PagerTabStrip tab;// 标题private List<String> titleList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* * 通过View对象作为ViewPager的数据源 * */ // 先新建一个ViewList集合 viewList = new ArrayList<View>(); // 将布局转成View对象的方法: View view1 = View.inflate(this, R.layout.view1, null); View view2 = View.inflate(this, R.layout.view2, null); View view3 = View.inflate(this, R.layout.view3, null); View view4 = View.inflate(this, R.layout.view4, null); // 将上面的View对象加入到ViewList集合中: viewList.add(view1); viewList.add(view2); viewList.add(view3); viewList.add(view4); // 为ViewPager页卡设置标题: titleList = new ArrayList<String>(); titleList.add("第一页"); titleList.add("第二页"); titleList.add("第三页"); titleList.add("第四页"); // 为PagerTabStrip设置一些属性 tab = (PagerTabStrip) findViewById(R.id.tab);// 初始化 tab.setBackgroundColor(Color.YELLOW);// 背景颜色 tab.setTextColor(Color.RED);// 文字颜色 tab.setDrawFullUnderline(false);// 去掉下面的长线 tab.setTabIndicatorColor(Color.GREEN);// 设置下面的小标线颜色 /* * 配置适配器,如果数据源是List<View>的话,适配器用PagerAdapter。 * */ // 初始化ViewPager pager = (ViewPager) findViewById(R.id.pager); // 创建PagerAdapter的适配器 MyPagerAdapter adapter = new MyPagerAdapter(viewList,titleList); // ViewPager加载适配器 pager.setAdapter(adapter); } }
效果图:丑丑的,哈哈。
第四步:还有另一种显示标题的方法,在main布局页面中添加<android.support.v4.view.PagerTitleStrip>控件,别的不需要改,因为适配器前面已经接收了标题数据源。
<?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" > <android.support.v4.view.ViewPager android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:id="@+id/pager" > <android.support.v4.view.PagerTabStrip android:id="@+id/tab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top"> </android.support.v4.view.PagerTabStrip> <android.support.v4.view.PagerTitleStrip android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom"> </android.support.v4.view.PagerTitleStrip> </android.support.v4.view.ViewPager> </LinearLayout>效果图:注意:两者都存在的时候,上面那个会失效的。
第三部分:
8. 使用适配器FragmentPagerAdapter实现:
案例三:
第一步:首先在前面的基础上,我们有四个布局页面分别为view1,view2,view3,view4,然后我们创建四个java文件分别是:fragment1,fragment2,fragment3和fragment4:其中fragment1中的内容为:
package com.example.viewpager;import com.example.viewpager.R;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;// Fragment在导包的时候可以选用android.support.v4.app的包public class fragment1 extends Fragment{// 继承于Fragment@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stubreturn inflater.inflate(R.layout.view1, container,false);// 这里设定了这个Fragment的布局页面为view1.}}
第二步:
创建MyFragmentPagerAdapter.java文件,
package com.example.viewpager;import java.util.List;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentPagerAdapter;/* * FragmentPagerAdapter和PagerAdapter的区别: * 前者是一次性加载所有的页卡,而后者是默认加载三个页卡。 * 后者在页卡数量超过三个的时候,滑动的时候就存在动态销毁和创建的过程 * 而前者不存在这个问题。 * */public class MyFragmentPagerAdapter extends FragmentPagerAdapter {private List<Fragment> fragList;private List<String> titleList;// 构造函数public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> fragList,List<String> titleList) {super(fm);// TODO Auto-generated constructor stubthis.fragList = fragList;this.titleList = titleList;}/* * 获取Fragment对象 * */@Overridepublic Fragment getItem(int arg0) {// TODO Auto-generated method stubreturn fragList.get(arg0);}/* * 获取标题 * */@Overridepublic CharSequence getPageTitle(int position) {// TODO Auto-generated method stubreturn titleList.get(position);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn fragList.size();}}第三步:修改MainActivity的活动文件:主要是修改了后来适配器的加载:
package com.example.viewpager;import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.app.Activity;import android.graphics.Color;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentManager;import android.support.v4.view.PagerTabStrip;import android.support.v4.view.ViewPager;import android.view.Menu;import android.view.View;// 这里的继承改了,不是继承Activity了public class MainActivity extends FragmentActivity {private List<View> viewList;private ViewPager pager;private PagerTabStrip tab;// 标题private List<String> titleList;private List<Fragment> fragList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* * 通过View对象作为ViewPager的数据源 * */ // 先新建一个ViewList集合 viewList = new ArrayList<View>(); // 将布局转成View对象的方法: View view1 = View.inflate(this, R.layout.view1, null); View view2 = View.inflate(this, R.layout.view2, null); View view3 = View.inflate(this, R.layout.view3, null); View view4 = View.inflate(this, R.layout.view4, null); // 将上面的View对象加入到ViewList集合中: viewList.add(view1); viewList.add(view2); viewList.add(view3); viewList.add(view4); /* * 通过Fragment作为ViewPager的数据源 * */ fragList = new ArrayList<Fragment>(); fragList.add(new fragment1()); fragList.add(new fragment2()); fragList.add(new fragment3()); fragList.add(new fragment4()); // 为ViewPager页卡设置标题: titleList = new ArrayList<String>(); titleList.add("第一页"); titleList.add("第二页"); titleList.add("第三页"); titleList.add("第四页"); // 为PagerTabStrip设置一些属性 tab = (PagerTabStrip) findViewById(R.id.tab);// 初始化 tab.setBackgroundColor(Color.YELLOW);// 背景颜色 tab.setTextColor(Color.RED);// 文字颜色 tab.setDrawFullUnderline(false);// 去掉下面的长线 tab.setTabIndicatorColor(Color.GREEN);// 设置下面的小标线颜色 /* * 配置适配器,如果数据源是List<View>的话,适配器用PagerAdapter。 * */ // 初始化ViewPager pager = (ViewPager) findViewById(R.id.pager); // 创建FragmentPagerAdapter的适配器 // 关于第一个参数fm,如果是以前用getFragmentManager()。 // 现在是import android.support.v4.app.FragmentManager;,所以用getSupportFragmentManager MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragList, titleList); // ViewPager加载适配器 pager.setAdapter(adapter); } }效果图:与案例二的效果图一样的:
这里有一个注意点:
但下面如果继承的是FragmentStatePagerAdapter类的话,就会和PagerAdapter一样会动态销毁和创建。它还需要多创建两个方法
package com.example.viewpager;import java.util.List;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentPagerAdapter;import android.support.v4.app.FragmentStatePagerAdapter;import android.view.ViewGroup;/* * FragmentPagerAdapter和PagerAdapter的区别: * 前者是一次性加载所有的页卡,而后者是默认加载三个页卡。 * 后者在页卡数量超过三个的时候,滑动的时候就存在动态销毁和创建的过程 * 而前者不存在这个问题。 * 但下面如果继承的是FragmentStatePagerAdapter类的话,就会和PagerAdapter一样会动态销毁和创建。它还需要多创建两个方法 * * */public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {private List<Fragment> fragList;private List<String> titleList;public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> fragList,List<String> titleList) {super(fm);// TODO Auto-generated constructor stubthis.fragList = fragList;this.titleList = titleList;}/* * 获取Fragment对象 * */@Overridepublic Fragment getItem(int arg0) {// TODO Auto-generated method stubreturn fragList.get(arg0);}/* * 获取标题 * */@Overridepublic CharSequence getPageTitle(int position) {// TODO Auto-generated method stubreturn titleList.get(position);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn fragList.size();}@Overridepublic Object instantiateItem(ViewGroup arg0, int arg1) {// TODO Auto-generated method stubreturn super.instantiateItem(arg0, arg1);}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// TODO Auto-generated method stubsuper.destroyItem(container, position, object);}}
修改MainActivity页面即可:
package com.example.viewpager;import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.app.Activity;import android.graphics.Color;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentManager;import android.support.v4.view.PagerTabStrip;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Toast;// 添加监听器,监听页卡切换到多少页public class MainActivity extends FragmentActivity implements OnPageChangeListener{private List<View> viewList;private ViewPager pager;private PagerTabStrip tab;// 标题private List<String> titleList;private List<Fragment> fragList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* * 通过View对象作为ViewPager的数据源 * */ // 先新建一个ViewList集合 viewList = new ArrayList<View>(); // 将布局转成View对象的方法: View view1 = View.inflate(this, R.layout.view1, null); View view2 = View.inflate(this, R.layout.view2, null); View view3 = View.inflate(this, R.layout.view3, null); View view4 = View.inflate(this, R.layout.view4, null); // 将上面的View对象加入到ViewList集合中: viewList.add(view1); viewList.add(view2); viewList.add(view3); viewList.add(view4); /* * 通过Fragment作为ViewPager的数据源 * */ fragList = new ArrayList<Fragment>(); fragList.add(new fragment1()); fragList.add(new fragment2()); fragList.add(new fragment3()); fragList.add(new fragment4()); // 为ViewPager页卡设置标题: titleList = new ArrayList<String>(); titleList.add("第一页"); titleList.add("第二页"); titleList.add("第三页"); titleList.add("第四页"); // 为PagerTabStrip设置一些属性 tab = (PagerTabStrip) findViewById(R.id.tab);// 初始化 tab.setBackgroundColor(Color.YELLOW);// 背景颜色 tab.setTextColor(Color.RED);// 文字颜色 tab.setDrawFullUnderline(false);// 去掉下面的长线 tab.setTabIndicatorColor(Color.GREEN);// 设置下面的小标线颜色 /* * 配置适配器,如果数据源是List<View>的话,适配器用PagerAdapter。 * */ // 初始化ViewPager pager = (ViewPager) findViewById(R.id.pager); // 创建FragmentPagerAdapter的适配器 // 关于第一个参数fm,如果是以前用getFragmentManager()。 // 现在是import android.support.v4.app.FragmentManager;,所以用 MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragList, titleList); // ViewPager加载适配器 pager.setAdapter(adapter); // 加载监听器 pager.setOnPageChangeListener(this); }@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}@Overridepublic void onPageSelected(int arg0) {// 从0开始计算的。Toast.makeText(this, "当前是第"+(arg0+1)+"个页面", Toast.LENGTH_SHORT).show();} }效果图:
- Android入门(33)——第十章 使用ViewPager实现导航
- 使用ViewPager实现Android帮助导航
- 第十章—ViewPager的使用
- 使用ViewPager实现导航
- 使用ViewPager实现导航
- ViewPager的详解(使用viewPager实现导航页面)
- Android学习-ViewPager实现导航
- 使用ViewPager实现导航页
- 使用Viewpager实现Tab导航
- android之ViewPager的使用实现应用的导航功能
- Android UI学习笔记 之 使用ViewPager实现导航
- Android之ViewPager总结(五)——使用Fragment实现ViewPager滑动
- Android中的RadioGroup+ViewPager+Fragment导航样式实现(续)
- Android 导航条效果实现(三) ViewPager+PagerTabStrip
- Android 导航条效果实现(六) TabLayout+ViewPager+Fragment
- Android底部导航栏实现(四)之TabLayout+ViewPager
- Android中导航栏实现(Fragment+ViewPager+TabLayout)
- 【Android】Fragment+Viewpager实现底部导航栏(带小红点)
- js原生排序和快速排序方法
- python的学习
- 用CocoaPods做iOS程序的依赖管理(唐巧)
- items( ) 与 iteritems()
- qt 坐标 pos globalPos()
- Android入门(33)——第十章 使用ViewPager实现导航
- 黑马程序员————第十七天
- Python科学计算类库
- POJ 1936 All in All(水~)
- Summary Ranges
- leetCode(34):Reverse Words in a String
- Android环境配置
- oracle临时表
- Struts2中namespace的用法