標籤:
Android應用開發中,經常會用到ViewPager + Fragment,雖然效果不錯,但隨之而來的還有一些問題,下面就說說其中的初始化問題。
ViewPager初始化時會預先載入前後的2個頁面,即使設定了setOffscreenPageLimit(0); 它至少也會預先載入一個頁面
但在實際情境中,可能我們不需要這個預先載入的功能,這時我們就需要對其進行一些控制。
我使用的方法是setUserVisibleHint(boolean isVisibleToUser)
每次ViewPager預先載入頁面的時候,被預先載入的Fragment都會調用這個方法,所以我就通過這個方法來控制Fragment裡面的資料初始化
使用前提是Fragment頁面的數量不是很多,設定setOffscreenPageLimit(所有Fragment的數量);
原因是如果不全部預先載入,那麼當滑動頁面超出預先載入範圍之後,就會有頁面被銷毀,那麼這個控制方法就失效了,當然,如果沒有特殊的需求
不設定這個方法也不會有問題,主要看自己的需求。
具體方法如下:
public boolean canExcute = true;//為了onActivityCreated中setUserVisibleHint方法只執行一次
public boolean isFirstExcute = true;//標記頁面是否是第一次載入,為了初始化只執行一次
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (canExcute) {//頁面第一次載入時執行,以後不在執行
canExcute = false;
setUserVisibleHint(getUserVisibleHint());
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (canExcute) {//onActivityCreated方法執行之前,不讓此方法執行
return;
}
if (isVisibleToUser && isFirstExcute) {// 頁面可見並且是第一次載入
isFirstExcute= false;//標記頁面已經載入過一次,以後不需要在執行
initData();//把你只需要初始化一次的資料寫在這個方法裡面
}
if (getUserVisibleHint()) {// 頁面每次對使用者可見時執行
} else {
}
}
以上方法不一定對所有情境都適用,大家使用時還是需要經過測試並改進。
Android - ViewPager+Fragment初始化問題