編輯:關於android開發
這個demo是我在csdn上面down下來的,這裡貼出原作者。(http://blog.csdn.net/u013758734/article/details/29848117)
我們在四個fragment裡面各個生命周期方法都添加日志輸出。
當第一次打開demo我們查看日志輸出看了這三個應該可以知道又ThreeFragment滑倒FourFragment怎麼變化的吧,TwoFragment會被銷毀。
總結:viewpager默認會把左右兩頁緩存好,那麼已經緩存好了的生命周期都是一樣的,而且生命周期都會在同一個狀態。
既然默認viewpager是緩存兩頁,那肯定有設置緩存頁數的方法啊,就是:
mViewPager.setOffscreenPageLimit(3);
這裡有4頁,那麼需要緩存3頁。當設置了這個方法,我們再看看,進入demo:
我們會發現,FourFragment也直接緩存好了,這和理論是一致的,至於什麼周期的順序大家可以自己理解。然而無論這4頁怎麼滑,生命周期都沒變化,那麼這裡又衍生了一個問題,當我進入第一頁的時候,就把其他幾頁都加載了,這樣一下就加載很多資源,怎麼優化這個問題呢。這個我們下面再討論。我們先看看這個viewpager被activity遮擋,退出時候變化。
上面講了這麼多,分析了viewpager嵌套fragment其生命周期變化,當我們設置了setOffscreenPageLimit(3)這之後,進入這個viewpager,所有的fragment都會全部進入onresume狀態,相當於將所有的數據一下加載完畢,當我們有很多頁或者很多數據時,對應用的負擔很大,怎樣處理這個問題呢。
fragment為我們提供了setUserVisibleHint(boolean isVisibleToUser)方法
我們在每個fragment裡面添加這個方法,如
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
if (isVisibleToUser) {
Log.i("TAG", "OneFragment--setUserVisibleHint");
}
super.setUserVisibleHint(isVisibleToUser);
}
當我們進入demo時
發現第一個執行的就是setUserVisibleHint方法,理解:這個方法是當fragment出現在屏幕時,isVisibleToUser參數才會置true,所以我們是不是可以很好的利用這個方法呢,我們可以在這個方法裡面寫加載數據的方法。
依次進入其他幾個fragment,其setUserVisibleHint方法會被依次執行
總結:遇到viewpager裡面嵌套fragment時候,setUserVisibleHint和setOffscreenPageLimit方法可以配合著使用,這樣最大化的優化這個模塊。
以上講的是viewpager裡面嵌套fragment的時候,當在一個container裡面添加要切換的幾個fragment,這個時候各個fragment之間的切換,這個時候生命周期怎樣變化呢,我們先貼一段在一個container裡面設置幾個fragment的寫法的代碼。
FragmentTransaction transaction = fragmentManager.beginTransaction();
hideFragments(transaction);
switch (index) {
case 2:
if (myInfoFragment == null) {
myInfoFragment = new MyInfoFragment();
transaction.add(R.id.content, myInfoFragment);
} else {
transaction.show(myInfoFragment);
}
break;
case 0:
if (pharmacistFragment == null) {
pharmacistFragment = new PharmacistFragment();
transaction.add(R.id.content, pharmacistFragment);
} else {
transaction.show(pharmacistFragment);
}
break;
case 1:
if (findFragment == null) {
findFragment = new FindFragment();
transaction.add(R.id.content, findFragment);
} else {
transaction.show(findFragment);
}
break;
default:
break;
}
transaction.commit();
這樣寫法和viewpager嵌套fragment的生命周期差不多,唯一區別就是,當進入第一頁的時候,默認不會一下就把其他兩頁緩存好(當然你也可以這樣寫),當進入其他兩頁,緩存好了後,其生命周期變化就完全一致了,所有的fragment的生命周期都在一個狀態。當然,也要配置著setUserVisibleHint方法使用,優化這個模塊。具體的demo演示,我就不做了,大家可以自己動手。
有什麼疑問歡迎留言
付源碼http://download.csdn.net/detail/xiangxi101/9490794
/**
* --------------
* 歡迎轉載 | 轉載請注明
* --------------
* 如果對你有幫助,請點擊|頂|
* --------------
* 請保持謙遜 | 你會走的更遠
* --------------
* @author css
* @github https://github.com/songsongbrother
* @blog http://blog.csdn.net/xiangxi101
*/
Android handler 詳解(面試百分之100問到),androidhandlerhandler在Android中被稱為“消息處理者”,在
美團Android資源混淆保護實踐 前言 Android應用中的APK安全性一直遭人诟病,市面上充斥著各種被破解或者漢化的應用,破解者可以非常簡單的通過破解工具就能對一個
HBase & thrift & C++編程HBase & thrift & C++編程.pdf目錄目錄11.前言12.啟動和停止thrift2 12.1
Android開發中使用七牛雲存儲進行圖片上傳下載, Android開發中的圖片存儲本來就是比較耗時耗地的事情,而使用第三方的七牛雲,便可以很好的解決這些後顧之憂,最近
安卓開發學習經歷2--《第一行代碼》coolweather項目SQL語句
滑動指示選項卡android.support.design.widget