跟踪fragment来回切换过程

发布时间:2020-06-30 02:29:05 作者:truesea
来源:网络 阅读:611

从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;
}


推荐阅读:
  1. 过程掌握:过程的创立、终止、壅塞、叫醒和切换
  2. Fragment基本使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

fragment 切换过程 nt

上一篇:mysql数据库5.7版修改密码详细(centos7)

下一篇:.NET牛人应该知道些什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》