Android App中使用ViewPager+Fragment實(shí)現(xiàn)滑動(dòng)切換效果
在android應(yīng)用中,多屏滑動(dòng)是一種很常見的風(fēng)格,沒有采用viewpager的代碼實(shí)現(xiàn)會(huì)很長(zhǎng),如果采用ViewPager,代碼就會(huì)短很多,但是使用ViewPager也有弊端:需要導(dǎo)入android-support-v4.jar、細(xì)節(jié)無法控制。不過現(xiàn)在情況已經(jīng)不一樣了,android-support-v4中提供了很多實(shí)用的功能,以至于現(xiàn)在新建一個(gè)android工程默認(rèn)都會(huì)導(dǎo)入這個(gè)jar包。那我們就也采用viewpager來做滑動(dòng)吧。另外一個(gè)概念就是Fragment和FragmentActivity,F(xiàn)ragment是一個(gè)特殊的類,有著和activity一致的生命周期和view一致的界面,也就是Fragment就等于具有生命周期的View,但是,要注意的是:Fragment并不是View,它和View沒有繼承關(guān)系。使用Fragment的好處是:Fragment可以重用,而且每個(gè)Fragment可以在內(nèi)部處理自己的業(yè)務(wù)就像activity一樣,這樣模塊間耦合較低,比把所有的業(yè)務(wù)都寫在一個(gè)activity內(nèi)部邏輯要清晰很多。還有就是,由于每個(gè)模塊的業(yè)務(wù)都在Fragment內(nèi)部來實(shí)現(xiàn),這樣activity只要管理好幾個(gè)Fragment就行了,不需要做和業(yè)務(wù)相關(guān)的事情,最后,F(xiàn)ragment可以用來做不同分辨率機(jī)型的適配。Fragment在sdk(android 3.0及更高)和android-support-v4里面都有,但是由于兼容性的問題,我們只能使用android-support-v4里面的Fragment,除非你想你的apk只跑在3.0以后的android手機(jī)上,F(xiàn)ragmentActivity的情況和Fragment類似。關(guān)于Fragment和FragmentActivity,其實(shí)有一些基本的用法需要了解一下,但是考慮到Fragment不是本文的重點(diǎn),所以這里就不介紹了,另外,本文只用Fragment做了一個(gè)簡(jiǎn)單的界面,大家應(yīng)該一看就懂,好了,言歸正傳。
ViewPager + Fragment 經(jīng)常用到 代碼是從 actionbarsherlock 中提取出來的,這個(gè)效果都知道是 滑動(dòng)來切換的。直接上代碼了
在這里簡(jiǎn)單說明一下 FragmentStatePagerAdapter 和 FragmentPagerAdapter
2個(gè)adapter:
第一種 fragment狀態(tài)adapter - 在當(dāng)前只會(huì)存在 前1個(gè)fragment 當(dāng)前 fragment 和 下1個(gè) fragment 其他銷毀 ,適合加載多數(shù)據(jù);
第二種 FragmentPagerAdapter - 全部存在,所以不太適合加載 大量的數(shù)據(jù) 如圖片什么的,很容易內(nèi)存溢出。
工程結(jié)構(gòu):

1.activity adapter 在一起 (static類型的 Fragment)
public class ViewPageFragment extends FragmentActivity {
//這個(gè)是有多少個(gè) fragment頁面
static final int NUM_ITEMS = 5;
private MyAdapter mAdapter;
private ViewPager mPager;
private int nowPage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pagers_fragment_main);
mAdapter = new MyAdapter(getSupportFragmentManager() );
mPager = (ViewPager)findViewById(R.id.mypagers_pager);
mPager.setAdapter(mAdapter);
}
/**
* 有狀態(tài)的 ,只會(huì)有前3個(gè)存在 其他銷毀, 前1個(gè), 中間, 下一個(gè)
*/
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
//得到每個(gè)item
@Override
public Fragment getItem(int position) {
return ArrayFragment.newInstance(position);
}
// 初始化每個(gè)頁卡選項(xiàng)
@Override
public Object instantiateItem(ViewGroup arg0, int arg1) {
// TODO Auto-generated method stub
return super.instantiateItem(arg0, arg1);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
System.out.println( "position Destory" + position);
super.destroyItem(container, position, object);
}
}
/**
* 無狀態(tài)的 會(huì)全部加載著, 這個(gè)適合少量的 特別多的圖片啊啥的 還是用 FragmentStatePagerAdapter
* @author lilei
*/
// public static class MyAdapter extends FragmentPagerAdapter {
// public MyAdapter(FragmentManager fm ) {
// super(fm);
//
// }
//
// @Override
// public int getCount() {
// return NUM_ITEMS;
// }
//
// @Override
// public Fragment getItem(int position) {
// // 返回相應(yīng)的 fragment
// return ArrayFragment.newInstance(position);
// }
//
// @Override
// public void destroyItem(ViewGroup container, int position, Object object) {
// System.out.println( "position Destory" + position);
// super.destroyItem(container, position, object);
// }
// }
/**
* 所有的 每個(gè)Fragment
*/
public static class ArrayFragment extends Fragment {
int mNum;
static ArrayFragment newInstance(int num) {
ArrayFragment array= new ArrayFragment();
Bundle args = new Bundle();
args.putInt("num", num);
array.setArguments(args);
return array;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments() != null ? getArguments().getInt("num") : 1;
System.out.println("mNum Fragment create ="+ mNum);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
System.out.println("onCreateView = ");
//在這里加載每個(gè) fragment的顯示的 View
View v = null;
if(mNum == 0){
v = inflater.inflate(R.layout.pagers_fragment1, container, false);
((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
}else if(mNum == 1){
v = inflater.inflate(R.layout.pagers_fragment1, container, false);
((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
}else if(mNum == 2){
v = inflater.inflate(R.layout.pagers_fragment1, container, false);
((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
}else{
v = inflater.inflate(R.layout.pagers_fragment1, container, false);
((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
}
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
System.out.println("onActivityCreated = ");
super.onActivityCreated(savedInstanceState);
}
@Override
public void onDestroyView(){
System.out.println(mNum + "mNumDestory");
super.onDestroyView();
}
@Override
public void onDestroy(){
super.onDestroy();
}
}
}
2. 和 1也沒什么太大區(qū)別( 個(gè)中用處 看個(gè)人了 )
public class ViewPageFragmentCS extends FragmentActivity {
//這個(gè)是有多少個(gè) fragment頁面
private MyAdapter mAdapter;
private ViewPager mPager;
private List<Entity> list = new ArrayList<ViewPageFragmentCS.Entity>();;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pagers_fragment_main);
for (int i = 0; i < 7 ; i++) {
Entity ee = new Entity();
ee.name = "ll"+ i;
ee.age = ""+ i;
list.add(ee);
}
mAdapter = new MyAdapter(getSupportFragmentManager(),list);
mPager = (ViewPager)findViewById(R.id.mypagers_pager);
mPager.setAdapter(mAdapter);
}
private class Entity{
public String name;
public String age;
}
// 在這里你可以傳 list<Fragment> 也可以傳遞 list<Object>數(shù)據(jù)
public class MyAdapter extends FragmentStatePagerAdapter {
List<Entity> list_ee;
public MyAdapter(FragmentManager fm, List<Entity> ee) {
super(fm);
this.list_ee = ee ;
}
@Override
public int getCount() {
return list_ee.size();
}
// 初始化每個(gè)頁卡選項(xiàng)
@Override
public Object instantiateItem(ViewGroup arg0, int position) {
ArrayFragment ff = (ArrayFragment)super.instantiateItem(arg0, position);
ff.setThings(list_ee.get(position),position);
return ff;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
System.out.println( "position Destory" + position);
super.destroyItem(container, position, object);
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return new ArrayFragment();
}
}
/**
* 所有的 每個(gè)Fragment
*/
public class ArrayFragment extends Fragment {
private Entity ee;
private int position;
public void setThings(Entity ee,int position){
this.ee =ee ;
this.position = position;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
System.out.println("onCreateView = ");
//在這里加載每個(gè) fragment的顯示的 View
View v = inflater.inflate(R.layout.pagers_fragment1, container, false);
((TextView)v.findViewById(R.id.textView1)).setText(ee.name+ "= ee.Name -=age"+ ee.age);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
System.out.println("onActivityCreated = ");
super.onActivityCreated(savedInstanceState);
}
@Override
public void onDestroyView(){
System.out.println("onDestroyView = "+ position);
super.onDestroyView();
}
@Override
public void onDestroy(){
System.out.println("onDestroy = "+ position);
super.onDestroy();
}
}
}
直接復(fù)制過去就可以看效果了 別忘記 V4包,xml 布局文件 自己隨便整個(gè)吧。
滑動(dòng)到第3個(gè)頁面的時(shí)候可以看到第1個(gè)頁面銷毀第4個(gè)生成,當(dāng)前存在2、3、4:

- Android如何使用ViewPager2實(shí)現(xiàn)頁面滑動(dòng)切換效果
- Android HorizontalScrollView滑動(dòng)與ViewPager切換案例詳解
- Android使用TabLayou+fragment+viewpager實(shí)現(xiàn)滑動(dòng)切換頁面效果
- Android ViewPager撤消左右滑動(dòng)切換功能實(shí)現(xiàn)代碼
- Android開發(fā)之使用ViewPager實(shí)現(xiàn)圖片左右滑動(dòng)切換效果
- Android中的ViewPager視圖滑動(dòng)切換類的入門實(shí)例教程
- Android應(yīng)用中利用ViewPager實(shí)現(xiàn)多頁面滑動(dòng)切換效果示例
- Android編程實(shí)現(xiàn)ViewPager多頁面滑動(dòng)切換及動(dòng)畫效果的方法
- Android實(shí)現(xiàn)界面左右滑動(dòng)切換功能
- Android開發(fā)之ViewPager實(shí)現(xiàn)滑動(dòng)切換頁面
相關(guān)文章
談?wù)凙ndroid開發(fā)之RecyclerView的使用全解
這篇文章主要介紹了談?wù)凙ndroid開發(fā)之RecyclerView的使用全解,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12
Android?O對(duì)后臺(tái)Service限制詳解
這篇文章主要為大家介紹了Android?O對(duì)后臺(tái)Service限制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android 實(shí)現(xiàn)界面刷新的幾種方法
這篇文章主要介紹了Android 實(shí)現(xiàn)界面刷新的相關(guān)資料,這里提供了幾種方法及實(shí)例代碼,具有一定的參考價(jià)值,需要的朋友可以參考下2016-11-11
詳解Android系統(tǒng)中跨應(yīng)用數(shù)據(jù)分享功能的實(shí)現(xiàn)
這篇文章主要介紹了Android系統(tǒng)中跨應(yīng)用數(shù)據(jù)分享功能的實(shí)現(xiàn),文中分為發(fā)送文字、二進(jìn)制內(nèi)容和圖片三種情況來講,需要的朋友可以參考下2016-04-04
老項(xiàng)目遷移AndroidStudio3.0遇到的坑
給大家分享了老的項(xiàng)目以及程序遷移到了AndroidStudio3.0遇到的坑和問題解決辦法,希望給你做個(gè)參考。2017-11-11
Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)
這篇文章主要介紹了Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2016-02-02
Android自定義ListView實(shí)現(xiàn)仿QQ可拖拽列表功能
這篇文章主要介紹了Android自定義ListView實(shí)現(xiàn)仿QQ可拖拽列表功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08

