从fragment-A切换到fragment-B,再从fragment-B切换到fragment-A中。跟踪发现,切换回到fragment-A后,fragment-A的实例变量的值不会被重置,保持和上次相同,但是fragment-A的life cycle方法被重新调用。
第1次创建fragment时,生命周期方法调用顺序是:
11-06 13:56:26.519: D/OrderVideoFragment(2504): ++onCreate++
11-06 13:56:26.529: D/OrderVideoFragment(2504): ++onCreateView++
11-06 13:56:26.549: D/OrderVideoFragment(2504): ++onActivityCreated++
11-06 13:56:26.549: D/OrderVideoFragment(2504): ++onStart++
11-06 13:56:26.549: D/OrderVideoFragment(2504): ++onResume++
切换到其他fragment时,查看日志
11-06 13:57:44.379: D/OrderVideoFragment(2504): ++onPause++
11-06 13:57:44.379: D/OrderVideoFragment(2504): ++onStop++
再从其他fragment切换回来,查看日志
11-06 13:58:36.429: D/OrderVideoFragment(2504): ++onCreateView++
11-06 13:58:36.469: D/OrderVideoFragment(2504): ++onActivityCreated++
11-06 13:58:36.469: D/OrderVideoFragment(2504): ++onStart++
11-06 13:58:36.469: D/OrderVideoFragment(2504): ++onResume++
从日志中可以发现,在切换到其他fragment时,并没有调用onDestroy方法,再从其他fragment切换回来时,也没有再次调用onCreate方法。由此可以说明,在fragment来回切换过程中,fragment并没有销毁,所以也没有重新创建,只是按照fragment的设计约定执行了一些生命周期方法。
既然这样,那么在切换回到OrderVideoFragment时,实例变量保存着原来的值就不难理解了,我们在切换回来之后,就可以利用保存在变量中的值来恢复fragment原来的界面。例如在OrderVideoFragment中,第1次创建时要从网络加载数据,那在后来切换回来就可以利用上次从网络加载的数据。
以下说明一下OrderVideoFragment类中的重要代码片段和重要方法
1. 重写onCreateView方法,创建fragment界面(界面其实表现为View组件)。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Logger.i(TAG, "++onCreateView++");
this.inflater = inflater;
this.context = getActivity();
setTagId();
setTitleName();
setBRTL();
View view = inflater.inflate(R.layout.weiyu_fragment, null);
// 文字标题
TextView titleView = (TextView) view.findViewById(R.id.txtTitleName);
if (!TextUtils.isEmpty(titleName)) {
titleView.setVisibility(View.VISIBLE);
titleView.setText(titleName);
} else {
titleView.setVisibility(View.INVISIBLE);
}
// 图片标题
ImageView titleImageView = ((ImageView) view.findViewById(R.id.titleImage));
if (titleImageResId != 0) {
titleImageView.setVisibility(View.VISIBLE);
titleImageView.setImageResource(titleImageResId);
} else {
titleImageView.setVisibility(View.INVISIBLE);
}
// 菜单按钮
view.findViewById(R.id.btnMenu).setOnClickListener(this);
// 搜索按钮
view.findViewById(R.id.btnSearch).setOnClickListener(this);
pullToRefreshView = (PullToRefreshView) view.findViewById(R.id.pullView);
pullToRefreshView.setFootLocked(true);
pullToRefreshView.setOnHeaderRefreshListener(this);
mLayout = ((LinearLayout) view.findViewById(R.id.videoGroupsLayout));
return view;
}
2. 重新onStart方法。在onStart方法中加载数据。
@Override
public void onStart() {
super.onStart();
loadData();
}
3. 实现加载数据方法。
private void loadData() {
if(mResult == null)
loadDataFromNetWork();
else
loadDataFromCache();
}
4. 加载数据要分两种情况:
(1)从实例变量中加载数据。
private void loadDataFromCache() {
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
hideRefreshView();
hideWaitView();
mViewList.clear();
}
@Override
protected Void doInVoid... params) {
for (VideoGroupData dataItem : mData) {
mViewList.add(buildVideoGroupView(dataItem));
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
mLayout.removeAllViews();
for (View view : mViewList) {
mLayout.addView(view);
}
}
}.execute();
}
(2)从网络加载数据。
private void loadDataFromNetWork() {
IVideoFetcher.CallBack callBack = new IVideoFetcher.CallBackAdapter() {
@Override
public void onComplete(IVideoResult result) {
hideWaitView();
mResult = result;
// 加载数据成功
if (result.isSuccess()) {
mData = ((WeiyuVideoResult) result).getData();
mViewList.clear();
for (VideoGroupData dataItem : mData) {
mViewList.add(buildVideoGroupView(dataItem));
}
mLayout.removeAllViews();
for (View view : mViewList) {
mLayout.addView(view);
}
}
// 加载数据失败
else {
if (!isPullDownRefresh) {
showRefreshView();
}
UIUtils.showToast(context, getString(R.string.load_fail_tray_again_later));
}
if (isPullDownRefresh) {
pullToRefreshView.onHeaderRefreshComplete();
isPullDownRefresh = false;
}
}
@Override
public void onBegin() {
hideRefreshView();
if (!isPullDownRefresh)
showWaitView();
}
};
HashMap<String, String> params = new HashMap<String, String>();
params.put("q", null);
IVideoFetcher.doGet(WeiyuVideoResult.class, callBack, IVideoURL.getCloudVideoURL(), params);
}
5. 根据加载到的数据构建View界面。
private View buildVideoGroupView(VideoGroupData videoGroupData) {
int resid = bRTL ? R.layout.video_group2_rtl : R.layout.video_group2;
View view = (RelativeLayout) inflater.inflate(resid, null);
TextView titleView = ((TextView) view.findViewById(R.id.groupTitleName));
titleView.setText(videoGroupData.getTitle());
View titleLayout = view.findViewById(R.id.groupTitleLayout);
titleLayout.setOnClickListener(this);
titleLayout.setTag(cidTagId, videoGroupData.getId());
titleLayout.setTag(cnameTagId, videoGroupData.getTitle());
List<VideoItemData> items = videoGroupData.getData();
int n = items.size() / mColumns * mColumns; // 取偶数个item
items = CommonUtils.getFirstNItems(items, n);
VideoGridAdapter videoAdapter = new VideoGridAdapter(context, items, false);
videoAdapter.setBRTL(bRTL);
FixedGridLayout fixGridLayout = (FixedGridLayout) view.findViewById(R.id.fixGridLayout);
int cellWidth = UIUtils.getScreenWidthPixels(context) / mColumns;
fixGridLayout.setRowParams(cellWidth, mColumns);
fixGridLayout.setAdapter(videoAdapter);
return view;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。