日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ViewPager 详解(五)-----使用Fragment实现ViewPager滑动

發布時間:2025/3/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ViewPager 详解(五)-----使用Fragment实现ViewPager滑动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:前幾篇文章講解了ViewPager的普通實現方法,但Android官方最推薦的一種實現方法卻是使用fragment,下面我們使用fragment來重新實現一下第一篇《ViewPager 詳解(一)---基本入門》所實現的效果。

?

系列文章:

?

1、《ViewPager 詳解(一)---基本入門》

2、《ViewPager 詳解(二)---詳解四大函數》

3、《ViewPager 詳解(三)---PagerTabStrip與PagerTitleStrip添加標題欄的異同》

4、《ViewPager 詳解(四)----自主實現滑動指示條》

其它相關文章:

5、《Android Fragment完全解析,關于碎片你所需知道的一切》

6、《fragment中嵌套viewpager,vierpager中有多個fragment》

?

本篇效果圖:

在第一個頁面加一個Btn ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第一頁面向第二頁面滑動

??

? ? ? ? ?第二頁面向第三個頁面滑動

一、概述

從前面幾篇文章,我們知道,實現ViewPager是要有適配器的,我們前面用的適配器是PagerAdapter,而對于fragment,它所使用的適配器是:FragmentPagerAdapter.先看看官方對于這個類的解釋:(英文下面有中文解釋)

原文:

?

Class Overview


?

Implementation of?PagerAdapter?that represents each page as a?Fragment?that is persistently kept in the fragment manager as long as the user can return to the page.

This version of the pager is best for use when there are a handful of typically more static fragments to be paged through, such as a set of tabs. The fragment of each page the user visits will be kept in memory, though its view hierarchy may be destroyed when not visible. This can result in using a significant amount of memory since fragment instances can hold on to an arbitrary amount of state. For larger sets of pages, consider?FragmentStatePagerAdapter.

When using FragmentPagerAdapter the host ViewPager must have a valid ID set.

Subclasses only need to implement?getItem(int)?and?getCount()?to have a working adapter.

譯文:(譯的不好,大家可在評論中補充)

FragmentPagerAdapter派生自PagerAdapter,它是用來呈現Fragment頁面的,這些Fragment頁面會一直保存在fragment manager中,以便用戶可以隨時取用。

這個適配器最好用于有限個靜態fragment頁面的管理。盡管不可見的視圖有時會被銷毀,但用戶所有訪問過的fragment都會被保存在內存中。因此fragment實例會保存大量的各種狀態,這就造成了很大的內存開銷。所以如果要處理大量的頁面切換,建議使用FragmentStatePagerAdapter.

每一個使用FragmentPagerAdapter的ViewPager都要有一個有效的ID集合,有效ID的集合就是Fragment的集合(感謝夫諸同學的提示)

對于FragmentPagerAdapter的派生類,只需要重寫getItem(int)和getCount()就可以了。

二、具體實現

?

1、適配器實現——FragmentPagerAdapter

先看完整代碼,再細講:

?

[java]?view plaincopy
  • public?class?FragAdapter?extends?FragmentPagerAdapter?{??
  • ??
  • ????private?List<Fragment>?mFragments;??
  • ??????
  • ????public?FragAdapter(FragmentManager?fm,List<Fragment>?fragments)?{??
  • ????????super(fm);??
  • ????????//?TODO?Auto-generated?constructor?stub??
  • ????????mFragments=fragments;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?Fragment?getItem(int?arg0)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????return?mFragments.get(arg0);??
  • ????}??
  • ??
  • ????@Override??
  • ????public?int?getCount()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????return?mFragments.size();??
  • ????}??
  • ??
  • }??
  • 這里有三個函數,根據第一部分的官方文檔,可知,對于FragmentPagerAdapter的派生類,只重寫getItem(int)和getCount()就可以了。

    ?

    對于構造函數,這里申請了一個Fragment的List對象,用于保存用于滑動的Fragment對象,并在創造函數中初始化:

    ?

    [java]?view plaincopy
  • public?FragAdapter(FragmentManager?fm,List<Fragment>?fragments)?{??
  • ????super(fm);??
  • ????//?TODO?Auto-generated?constructor?stub??
  • ????mFragments=fragments;??
  • }??
  • 然后在getItem(int arg0)中,根據傳來的參數arg0,來返回當前要顯示的fragment,下面是getItem的官方解釋,難度不大,不再細講。

    ?

    public abstract?Fragment?getItem?(int position)

    Return the Fragment associated with a specified position.

    最后,getCount()返回用于滑動的fragment總數;

    從構造函數所以看出,我們要構造Fragment的集合才行,所以下面我們就先產生我們所需要的Fragment類;

    ?

    2、三個Fragment類

    第一個Fragment類:

    XML:(layout1.xml)

    ?

    [html]?view plaincopy
  • <?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"?>??
  • ??????
  • ????<Button?android:id="@+id/fragment1_btn"??
  • ????????android:layout_width="wrap_content"??
  • ????????android:layout_height="wrap_content"??
  • ????????android:text="show?toast"??
  • ????????/>??
  • </LinearLayout>??
  • 在其中加入了一個Btn

    ?

    Java代碼:

    ?

    [java]?view plaincopy
  • public?class?Fragment1?extends?Fragment?{??
  • ??????
  • ????@Override??
  • ????public?View?onCreateView(LayoutInflater?inflater,?ViewGroup?container,??
  • ????????????Bundle?savedInstanceState)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????View?view=?inflater.inflate(R.layout.layout1,?container,?false);??
  • ??????????
  • ????????//對View中控件的操作方法??
  • ????????Button?btn?=?(Button)view.findViewById(R.id.fragment1_btn);??
  • ????????btn.setOnClickListener(new?View.OnClickListener()?{??
  • ??????????????
  • ????????????@Override??
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????//?TODO?Auto-generated?method?stub??
  • ????????????????Toast.makeText(getActivity(),?"點擊了第一個fragment的BTN",?Toast.LENGTH_SHORT).show();??
  • ????????????}??
  • ????????});??
  • ????????return?view;??
  • ????}??
  • }??
  • 在onCreateView()中返回要顯示的View,上面這段代碼簡單演示了如何對視圖里的控件進行操作,難度不大,不再細講,如果對Fragment不太熟悉的同學,先看看這篇文章:《Android Fragment完全解析,關于碎片你所需知道的一切》

    ?

    第二個Fragment類:

    XML代碼:(layout2.xml)原生代碼,沒有做任何更改

    ?

    [html]?view plaincopy
  • <?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="#ffff00"??
  • ????android:orientation="vertical"?>??
  • ??????
  • ??
  • </LinearLayout>??
  • java代碼:

    [java]?view plaincopy
  • public?class?Fragment2?extends?Fragment?{??
  • ??????
  • ????@Override??
  • ????public?View?onCreateView(LayoutInflater?inflater,?ViewGroup?container,??
  • ????????????Bundle?savedInstanceState)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????View?view=inflater.inflate(R.layout.layout2,?container,?false);??
  • ????????return?view;??
  • ????}??
  • ??
  • }??

  • 第三個Fragment類:

    ?

    XML代碼:(layout3.xml)同樣,原生代碼,沒做任何更改

    ?

    [html]?view plaincopy
  • <?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="#ff00ff"??
  • ????android:orientation="vertical"?>??
  • ??????
  • ??
  • </LinearLayout>??
  • java代碼:

    [java]?view plaincopy
  • public?class?Fragment3?extends?Fragment?{??
  • ??????
  • ????@Override??
  • ????public?View?onCreateView(LayoutInflater?inflater,?ViewGroup?container,??
  • ????????????Bundle?savedInstanceState)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????View?view=inflater.inflate(R.layout.layout3,?container,?false);??
  • ????????return?view;??
  • ????}??
  • ??
  • }??
  • 3、主activity實現

    核心代碼:

    ?

    ?

    [java]?view plaincopy
  • public?class?MainActivity?extends?FragmentActivity?{??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_main);??
  • ??
  • ????????//構造適配器??
  • ????????List<Fragment>?fragments=new?ArrayList<Fragment>();??
  • ????????fragments.add(new?Fragment1());??
  • ????????fragments.add(new?Fragment2());??
  • ????????fragments.add(new?Fragment3());???
  • ????????FragAdapter?adapter?=?new?FragAdapter(getSupportFragmentManager(),?fragments);??
  • ??????????
  • ????????//設定適配器??
  • ????????ViewPager?vp?=?(ViewPager)findViewById(R.id.viewpager);??
  • ????????vp.setAdapter(adapter);??
  • ????}??
  • ??
  • }??
  • ?

    首先有一個最值得注意的地方:Activity派生自FragmentActivity,其實這是有關Fragment的基礎知識,只有FragmentActivity才能內嵌fragment頁面,普通Activity是不行的。

    這段代碼主要分為兩步,第一步:構造適配器;第二步:設定適配器。

    先看構造適配器的過程:

    [java]?view plaincopy
  • //構造適配器??
  • List<Fragment>?fragments=new?ArrayList<Fragment>();??
  • fragments.add(new?Fragment1());??
  • fragments.add(new?Fragment2());??
  • fragments.add(new?Fragment3());???
  • FragAdapter?adapter?=?new?FragAdapter(getSupportFragmentManager(),?fragments);??
  • 構造一個fragment列表,然后將上面的三個Fragment類對應的實例添加進去,最后生成FragAdapter實例。
    至于第二步,設定適配器,沒什么好講的。

    ?

    ?

    4、可能出現的問題

    問題:在MainActivity中,當寫到這句:fragments.add(new Fragment1()); 向Fragment列表中添加Fragement對象實例時,會提示“無法將Fragment1()轉換為fragment”

    解決辦法 :這是因為導入包不一致,一般的問題在于:在Fragment1中導入的是android.app.Fragment,?而在這里導入類確是:android.support.v4.app.Fragment,包不同當然無法轉換,統一導入為android.support.v4.app.Fragment之后就正常了.參考文章《android之cannot convert from Fragment1 to Fragment》

    ?

    ?

    源碼下載地址:http://download.csdn.net/detail/harvic880925/7777849

    請大家尊重原創者版權,轉載請標明出處:http://blog.csdn.net/harvic880925/article/details/38660861? 不勝感激!

    轉載于:https://www.cnblogs.com/Free-Thinker/p/5480737.html

    總結

    以上是生活随笔為你收集整理的ViewPager 详解(五)-----使用Fragment实现ViewPager滑动的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 捆绑调教在线观看 | 91区| 日韩3p| 能在线观看的av | 好吊色在线观看 | 不卡的av电影 | 456亚洲影视 | 国产日韩免费视频 | 毛片aa| 色优久久 | 巨胸大乳www视频免费观看 | 欧美激情国产精品 | 亚洲小视频 | 欧美韩日精品 | 亚洲精选中文字幕 | 成人免费午夜 | 亚洲制服丝袜一区 | 亚洲一区二区三区三州 | 免费看国产精品 | 久久精品香蕉 | 亚洲国产一区二区三区 | 日韩精品午夜 | 天堂中文在线播放 | 欧美乱色 | 精品国产乱码久久久久久1区二区 | 99国产在线观看 | 国产精品成人3p一区二区三区 | 午夜777 | 超碰在线天天 | 99视频在线观看免费 | 葵司av电影| 色香蕉在线视频 | 精品在线播放视频 | 在线日韩| 亚洲精品美女久久久 | 欧美一级在线播放 | 国产资源一区 | 成人a在线| 国内精品久久久 | 欧美r级在线观看 | xxx老太太 | 欧美精品在线观看 | 最新啪啪网站 | 国产精品无 | 国产女同在线观看 | 九九少妇 | av999| 天堂国产一区二区三区 | 日韩欧美的一区二区 | 伊人久久久久噜噜噜亚洲熟女综合 | 久久久久久亚洲中文字幕无码 | 国产精品又黄又爽又色无遮挡 | 欧美在线激情 | 青青草激情视频 | 好姑娘在线观看高清完整版电影 | 男女涩涩网站 | 成人爱爱视频 | 欧美色综合天天久久综合精品 | 韩国一级淫一片免费放 | 精品在线免费观看视频 | 强睡邻居人妻中文字幕 | 污黄视频网站 | 精品动漫一区二区 | 亚洲a视频 | 欧美一区二区三区成人精品 | 综合性色 | 日韩免费一区二区三区 | 国产精品欧美综合亚洲 | 青娱乐激情 | 另类激情综合 | wwwwxxxxx日本| 男人干女人视频 | 亚洲人在线播放 | 91口爆一区二区三区在线 | 天天干夜夜玩 | 天天爱天天插 | 久久久免费观看视频 | 99免费在线 | 四川丰满妇女毛片四川话 | 人人射人人 | 一级大片在线观看 | 亚洲免费视频大全 | 天天躁日日躁狠狠躁av麻豆 | 欧美一级录像 | 中文乱码人妻一区二区三区视频 | 国产伦理片在线观看 | 色欧美综合 | 99久久久国产精品无码网爆 | 成人自拍网 | 风流少妇一区二区三区91 | 韩国裸体网站 | 免费看成人av | 日韩高清一级 | 麻豆一区二区三区在线观看 | 国产在线天堂 | 欧美高清性xxxxhd | 亚洲午夜无码av毛片久久 | 18久久| 日本免费精品 |