目錄
一、Fragment 對用戶可見的必要條件
fragment 是否對用戶可見,依賴於下面三個方法:
getUserVisibleHint
onResume
onStop
用戶可見:getUserVisibleHint()返回true 並且 onResume剛剛調用了
二、舉例說明
1. 一個Activity,四個fragment,依次是圖片、視頻、音頻、文件
2.代碼:
2.1 代碼介紹
代碼分三步
1. 本地變量,用於記錄狀態
2. 自定義方法,用於判斷fragment真實展現,不要用其提供的isVisible()方法
3. demo 打印日誌,用於講解
// 1. 本地變量,用於記錄狀態
private String mName;
private boolean mResume = false;// 標記onResume是否被剛剛調用
// 2. 自定義方法,用於判斷fragment真實展現,不要用其提供的isVisible()方法
public boolean isRealVisible(){
return getUserVisibleHint() && mResume;
}
// 3. demo 打印日誌,用於講解
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.e("TestFragment", "setUserVisibleHint mName="+ mName +" isVisibleToUser:"+isVisibleToUser+"\tisVisible:"+isVisible()+"\tisRealVisible:"+isRealVisible());
}
@Override
public void onResume() {
super.onResume();
mResume=true;
Log.e("TestFragment", "onResume mName="+mName+"\tisVisible:"+isVisible()+"\tisRealVisible:"+isRealVisible());
}
@Override
public void onStop() {
super.onStop();
mResume=false;
Log.e("TestFragment", "onStop mName="+mName+"\tisVisible:"+isVisible()+"\tisRealVisible:"+isRealVisible());
}
2.2 各種狀態的log
2.2.1 進入Activity
Activity顯示加載前兩個fragment:圖片、視頻
之後圖片調用setUserVisibleHint(true),
最後分別調用圖片、視頻的onResume
注意:此時系統的 isVisible 返回了true
2.2.2 滑動到tab2視頻
1. Activity先加載tab3音頻,並調用setVisibleToUser, 設置音頻爲false、圖片爲false、視頻爲true
2.調用音頻的onResume
2.2.3 回到桌面
調用已加載fragment的onStop方法
2.2.3 從桌面返回程序
調用已加載fragment的onResume方法
2.2.4 從tab2視頻滑到到tab1圖片
僅僅調用了視頻、圖片的setVisibleToUser方法,視頻爲false,圖片爲true
2.2.5 從tab1圖片進入其他activity
調用已加載fragment的onStop方法
2.2.6 從其他activity返回tab1圖片
調用已加載fragment的onResume方法
2.2.7 從tab1圖片,點擊tab4文件進入tab4
1. Activity先加載tab3音頻,並調用setVisibleToUser, 設置文件爲false,音頻爲false、圖片爲false、文件爲true
2.調用視頻的onResume