Android App在ViewPager中使用Fragment的实例讲解
据说android最推荐的是在viewpager中使用fragment,即viewpager中的页面不像前面那样用layoutinflater直接从布局文件加载,而是一个个fragment。注意这里的fragment
是android.support.v4.view包里的fragment,而不是android.app包里的fragment。
使用v4包里的fragment的activity必须继承自fragmentactivity。
其实使用fragment与前面不使用fragment非常类似:
第一步 在主布局文件里放一个viewpager组件
第二步 为每个页面建立布局文件,把界面写好
第三步 为每个页面新建fragment类,并加载布局文件中的界面
第四部 为viewpager设定adapter,只不过这里的adapter不是pageradapter,而是换成
fragmentpageradapter,实现两个方法:
getcount():返回页面数目
getitem(position):返回position位置的fragment。
下面来看一个viewpager与fragment实现页面滑动效果的例子:
首先继承fragmentactivity,
为viewpager提供展示所需的fragment和fragmentpageradapter:
fragment来指定页面的布局以及功能
// fragment private class myfragment extends fragment { private string text; private int color; public myfragment(string text, int color) { this.text = text; this.color = color; } @override public view oncreateview(layoutinflater inflater, @nullable viewgroup container, @nullable bundle savedinstancestate) { textview tv = new textview(mainactivity.this); tv.setbackgroundcolor(color); tv.settext(text); return tv; } }
adapter指定该viewpager有多少页面以及那个位置需要显示哪个页面:
// adapter private class myadapter extends fragmentpageradapter { public myadapter(fragmentmanager fm) { super(fm); } @override public int getcount() { return pages.size(); } @override public fragment getitem(int arg0) { return pages.get(arg0); } }
设置onpagechangelistener,指定页面改变时需要做什么其他操作:
@override public void onpagescrollstatechanged(int arg0) { } @override public void onpagescrolled(int arg0, float arg1, int arg2) { linearlayout.layoutparams lp = (android.widget.linearlayout.layoutparams) tabline.getlayoutparams(); lp.leftmargin = (int) ((arg0 + arg1) * mtablinewidth); tabline.setlayoutparams(lp); } @override public void onpageselected(int arg0) { // set titles for (int i = 0; i < titles.size(); i++) { if (arg0 == i) { titles.get(i).setselected(true); } else { titles.get(i).setselected(false); } } }
完整的代码:
package com.hzy.myviewpager; import java.util.arraylist; import android.graphics.color; import android.os.bundle; import android.support.annotation.nullable; import android.support.v4.app.fragment; import android.support.v4.app.fragmentactivity; import android.support.v4.app.fragmentmanager; import android.support.v4.app.fragmentpageradapter; import android.support.v4.view.viewpager; import android.support.v4.view.viewpager.onpagechangelistener; import android.util.displaymetrics; import android.view.display; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.view.view.onclicklistener; import android.view.viewgroup.layoutparams; import android.widget.linearlayout; import android.widget.textview; import com.hzy.myviewpager.r.id; public class mainactivity extends fragmentactivity implements onpagechangelistener, onclicklistener { viewpager pager = null; view tabline = null; private int mtablinewidth; // titles textview title1 = null; textview title2 = null; textview title3 = null; arraylist<textview> titles = null; arraylist<fragment> pages = null; @override protected void oncreate(bundle arg0) { super.oncreate(arg0); initview(); inittabline(); } private void initview() { setcontentview(r.layout.activity_main); pages = new arraylist<fragment>(); titles = new arraylist<textview>(); pager = (viewpager) findviewbyid(id.main_viewpager); title1 = (textview) findviewbyid(id.main_tab1); title2 = (textview) findviewbyid(id.main_tab2); title3 = (textview) findviewbyid(id.main_tab3); title1.setonclicklistener(this); title2.setonclicklistener(this); title3.setonclicklistener(this); titles.add(title1); titles.add(title2); titles.add(title3); // create new fragments pages.add(new myfragment("tab1", color.blue)); pages.add(new myfragment("tab2", color.red)); pages.add(new myfragment("tab3", color.cyan)); // set adapter pager.setadapter(new myadapter(getsupportfragmentmanager())); pager.setonpagechangelistener(this); pager.setcurrentitem(0); titles.get(0).setselected(true); } // tablines private void inittabline() { tabline = findviewbyid(id.main_tab_line); display display = getwindow().getwindowmanager().getdefaultdisplay(); displaymetrics outmetrics = new displaymetrics(); display.getmetrics(outmetrics); mtablinewidth = outmetrics.widthpixels / 3; layoutparams lp = tabline.getlayoutparams(); lp.width = mtablinewidth; tabline.setlayoutparams(lp); } @override public void onclick(view v) { switch (v.getid()) { case id.main_tab1: pager.setcurrentitem(0, true); break; case id.main_tab2: pager.setcurrentitem(1, true); break; case id.main_tab3: pager.setcurrentitem(2, true); break; default: break; } } @override public void onpagescrollstatechanged(int arg0) { } @override public void onpagescrolled(int arg0, float arg1, int arg2) { linearlayout.layoutparams lp = (android.widget.linearlayout.layoutparams) tabline.getlayoutparams(); lp.leftmargin = (int) ((arg0 + arg1) * mtablinewidth); tabline.setlayoutparams(lp); } @override public void onpageselected(int arg0) { // set titles for (int i = 0; i < titles.size(); i++) { if (arg0 == i) { titles.get(i).setselected(true); } else { titles.get(i).setselected(false); } } } // fragment private class myfragment extends fragment { private string text; private int color; public myfragment(string text, int color) { this.text = text; this.color = color; } @override public view oncreateview(layoutinflater inflater, @nullable viewgroup container, @nullable bundle savedinstancestate) { textview tv = new textview(mainactivity.this); tv.setbackgroundcolor(color); tv.settext(text); return tv; } } // adapter private class myadapter extends fragmentpageradapter { public myadapter(fragmentmanager fm) { super(fm); } @override public int getcount() { return pages.size(); } @override public fragment getitem(int arg0) { return pages.get(arg0); } } }
代码中通过实现onpagechangelistener接口手动设置了页面指示条的位置。
上一篇: Java中的5种同步辅助类介绍
下一篇: 深入探索Java常量池
推荐阅读
-
Android App在ViewPager中使用Fragment的实例讲解
-
Android App开发中ViewPager组件的入门使用教程
-
实例讲解Android应用开发中Fragment生命周期的控制
-
详解Android App中ViewPager使用PagerAdapter的方法
-
实例讲解Android应用开发中Fragment生命周期的控制
-
实例讲解Android app开发中ListView的基本使用及优化
-
实例讲解Android多线程应用开发中Handler的使用
-
实例讲解Android多线程应用开发中Handler的使用
-
redis在java中的使用(实例讲解)
-
JQuery Ajax 在asp.net中的使用并调用后台实例讲解