前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Fragment三问—B站真题

Fragment三问—B站真题

作者头像
码上积木
发布2020-10-29 16:39:24
7260
发布2020-10-29 16:39:24
举报
文章被收录于专栏:码上积木

Fragment作为Android最基本,最重要的基础概念之一,也是Activity的好搭档,在开发中经常会和他打交道。今天的三问就说关于Fragment:

  • Fragment生命周期,当hide,show,replace时候生命周期变化。
  • Activity 与 Fragment,Fragment 与 Fragment之间怎么交互通信。
  • Fragment遇到viewpager遇到过什么问题吗。

Fragment生命周期,当hide,show,replace时候生命周期变化

1)生命周期:

  • onAttach():Fragment和Activity相关联时调用。可以通过该方法获取Activity引用,还可以通过getArguments()获取参数。
  • onCreate():Fragment被创建时调用。
  • onCreateView():创建Fragment的布局。
  • onActivityCreated():当Activity完成onCreate()时调用。
  • onStart():当Fragment可见时调用。
  • onResume():当Fragment可见且可交互时调用。
  • onPause():当Fragment不可交互但可见时调用。
  • onStop():当Fragment不可见时调用。
  • onDestroyView():当Fragment的UI从视图结构中移除时调用。
  • onDestroy():销毁Fragment时调用。
  • onDetach():当Fragment和Activity解除关联时调用。

每个调用方法对应的生命周期变化:

  • add(): onAttach()->…->onResume()。
  • remove(): onPause()->…->onDetach()。
  • replace(): 相当于旧Fragment调用remove(),新Fragment调用add()。remove()+add()的生命周期加起来
  • show(): 不调用任何生命周期方法,调用该方法的前提是要显示的 Fragment已经被添加到容器,只是纯粹把Fragment UI的setVisibility为true。
  • hide(): 不调用任何生命周期方法,调用该方法的前提是要显示的Fragment已经被添加到容器,只是纯粹把Fragment UI的setVisibility为false。

Activity 与 Fragment,Fragment 与 Fragment之间怎么交互通信。

  • Activity 与 Fragment通信

Activity有Fragment的实例,所以可以执行Fragment的方法,或者传入一个接口。同样,Fragment可以通过getActivity()获取Activity的实例,也是可以执行方法。

  • Fragment 与 Fragment之间通信

1)直接获取另一个Fragmetn的实例

代码语言:javascript
复制
getActivity().getSupportFragmentManager().findFragmentByTag("mainFragment");

2)接口回调 一个Fragment里面去实现接口,另一个Fragment把接口实例传进去。

3)Eventbus等框架。

Fragment遇到viewpager遇到过什么问题吗。

  • 滑动的时候,调用setCurrentItem方法,要注意第二个参数smoothScroll。传false,就是直接跳到fragment,传true,就是平滑过去。一般主页切换页面都是用false。
  • 禁止预加载的话,调用setOffscreenPageLimit(0)是无效的,因为方法里面会判断是否小于1。需要重写setUserVisibleHint方法,判断fragment是否可见。
  • 不要使用getActivity()获取activity实例,容易造成空指针,因为如果fragment已经onDetach()了,那么就会报空指针。所以要在onAttach方法里面,就去获取activity的上下文。
  • FragmentStatePagerAdapter对limit外的Fragment销毁,生命周期为onPause->onStop->onDestoryView->onDestory->onDetach, onAttach->onCreate->onCreateView->onStart->onResume。也就是说切换fragment的时候有可能会多次onCreateView,所以需要注意处理数据。
  • 由于可能多次onCreateView,所以我们可以把view保存起来,如果为空再去初始化数据。见代码:
代码语言:javascript
复制
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (null == mFragmentView) {
                mFragmentView = inflater.inflate(getContentViewLayoutID(), null);
                ButterKnife.bind(this, mFragmentView);
                isDestory = false;
                initViewsAndEvents();
            }
        return mFragmentView;
    }

Android开发者们,快来关注公众号【码上积木】,每天三问面试题,并详细剖析,助你成为offer收割机。

积累也是一种力量。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上积木 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Fragment生命周期,当hide,show,replace时候生命周期变化
  • Activity 与 Fragment,Fragment 与 Fragment之间怎么交互通信。
  • Fragment遇到viewpager遇到过什么问题吗。
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档