关于fragment

本文详细介绍了Android中Fragment的生命周期,包括从onAttach到onDestroy的各个阶段,并提供了三种有效的Fragment与Activity之间的通信方法:通过setArguments传递参数、使用接口回调机制及利用EventBus框架。

前面已经写过一些内容了,再总结下:

1.fragment生命周期

onAttach(Activity):fragment与activity关联时调用。现已过时,最新方法是onAttach(Context);
onCreate(Bundle ):fragment对象初始创建时调用;
onCreateView(LayoutInflater, ViewGroup,Bundle):创建和fragment关联的View;
onActivityCreated(Bundle): 当activity的onCreate()方法结束后调用;
onStart():fragment真正显示给用户;
onResume():当包含该fragment的activity重新启用时调用;

onPause():当fragment所依赖的activity被挂起,或者fragment不在和用户交互时调用;
onStop():当fragment所依赖的activity被终止,或者fragment被隐藏时调用;
onDestroyView():当fragment对象被移除时调用;
onDestroy():fragment对象被清理完成后调用;
onDetach():当fragment对象和activity联系中断时调用;

2.fragment和activity通信
1)一般在activity中启动fragment,这种时候,如果想要从activity中传值给fragment,可以通过fragment.setArguments(bundle),将数据存到bundle中带给fragment,在fragment中,getArguments().getString()或者get其他,得到相应数据;

2)通过接口回调方式

@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
         mClickListener = (MClickListener) activity;
    }

可以在fragment中创建接口,并通过onAttach方法,将接口实例绑定至activity,就可以在fragment中通过mClickListener启动接口中的方法,在activity中实现接口,重写方法就能得到fragment传递来的数据;

3)一个强大的库EventBus
在应用中当想通知其他组件某些事情发生时就会使用到开源框架EventBus。它主要功能是可以替代Intent、Handler、BroadCast在Fragment、Activity、Service、线程之间传递消息。优点是开销小,代码简洁,解耦代码。

强大,好用。

<think>嗯,用户的问题是关于Fragment生命周期中,当Fragment可见但不可交互时调用的方法。我需要仔细回忆一下Fragment的生命周期方法,并找出对应的阶段。 首先,Fragment的生命周期和Activity有关联,但有些方法专门属于Fragment。比如onAttach、onCreate、onCreateView、onViewCreated、onStart、onResume、onPause、onStop、onDestroyView、onDestroy、onDetach这些方法。 用户提到的“可见但不可交互”应该是在视图已经创建并显示,但还未处于活跃状态的时候。根据引用中的信息,当Fragment被hide或show时,视图的可见性变化不会触发生命周期,而是直接改变可见性。但生命周期还是跟随Activity。 那当Fragment可见但不可交互的时候,可能是在onStart之后,onResume之前?或者是在某些特定的状态切换时? 回想一下,当Fragment被添加到Activity但还未处于前台时,比如在ViewPager中的情况,可能处于onStart状态。这时候Fragment的视图已经可见,但可能还不能与用户交互,因为Activity可能还未进入onResume状态。或者当Activity处于onPause时,Fragment也会进入onPause,此时可能可见但不可交互。 不过根据Android官方文档,当Fragment的视图被创建并添加到视图树中后,会调用onStart,这时候Fragment可见,但可能Activity还未完全进入前台。而onResume则是在Activity的onResume之后调用,此时Fragment处于活跃状态,可以交互。因此,在onStart之后到onResume之前,Fragment是可见但不可交互的。或者当Activity进入onPause时,Fragment也会调用onPause,此时可能仍然可见,但不可交互。 但用户的问题可能是指Fragment变为可见但还没准备好交互的情况,这时候应该是onStart方法。比如当Fragment被添加到后台栈,然后返回时,会经历onCreateView到onStart,此时可见但可能还未恢复交互。或者当Fragment被显示但Activity还没完全恢复时。 不过根据引用中的说明,hide和show不会改变生命周期,所以这种情况下不会触发onStop或onStart。因此,可能用户的问题更多是在常规生命周期中,当Fragment可见但不可交互的阶段,比如onStart到onResume之间,或者onPause之后。 这时候可能需要确认各个方法的作用:onStart表示Fragment可见,但此时可能Activity还未处于前台,所以Fragment不可交互;而onResume在Activity的onResume之后调用,此时Fragment可以交互。同样,onPause在Activity的onPause时调用,此时Fragment可能仍然可见,但不可交互。 所以,正确的答案应该是onStart和onPause这两个方法分别对应Fragment变得可见但不可交互的情况。当Fragment进入onStart时,开始可见但可能不可交互,直到onResume才能交互。当Activity进入onPause时,Fragment的onPause被调用,此时可能仍然可见,但不可交互。 但用户的问题可能更具体,比如在Fragment可见但不可交互时调用的方法,应该是onStart和onPause。但需要更准确的信息。 根据Android官方生命周期图,当Fragment变为可见时,会调用onStart,此时可能处于可见但不可交互的状态,直到onResume才可交互。而当Activity进入onPause时,Fragment的onPause被调用,此时可能仍然可见,但不可交互。因此,这两个方法可能对应不同的阶段。用户的问题可能是在这两个阶段中的某个方法。 但问题中的“可见但不可交互”具体是指哪个阶段呢?比如,当Fragment第一次被添加时,会经历onAttach到onResume,其中onStart之后可见,但可能此时还不能交互,直到onResume。或者当另一个Activity覆盖在当前Activity上时,原Activity的Fragment会进入onPause,此时可能仍然可见(比如对话框式的Activity),但不可交互。 所以,正确的回答应该是:当Fragment变得可见但不可交互时,会调用onStart(当从不可见到可见时)和onPause(当从可交互变为不可交互时)。 但用户的问题可能指的是某个特定的方法,比如在onStart时是否处于不可交互的状态?或者在onResume之后才能交互? 根据Android文档,onResume是在Fragment可交互之前调用的,所以可能onStart之后可见,但onResume之后才可交互。因此,在onStart到onResume之间,Fragment可见但不可交互。但实际中,可能这个时间非常短暂,因为Activity的onResume会紧接着调用Fragment的onResume。 另一种情况是,当Activity处于onPause状态时,Fragment的onPause被调用,此时Fragment可见但不可交互。例如,当另一个Activity部分覆盖当前Activity,当前Activity的Fragment仍然可见,但无法交互,此时处于onPause状态。 因此,用户的问题的答案应该是:当Fragment可见但不可交互时,调用的方法是onStart(当变为可见时)和onPause(当变为不可交互时)。 但需要更准确的信息,可能用户的问题是指Fragment从不可见到可见但尚未可交互的时候,这时候调用的是onStart。或者当Fragment处于可见但被暂停的时候,调用的是onPause。 根据引用中的内容,Fragment的show和hide不会改变生命周期,所以当hide时视图不可见,但生命周期不变。因此,当Fragment可见但不可交互的情况可能发生在onStart和onPause阶段。 最终答案应该是,在Fragment生命周期中,当可见但不可交互时调用的方法是onStart(当变为可见时)和onPause(当变为不可交互时)。不过需要确认官方文档的正确描述。 根据Android官方文档: - onStart(): Fragment可见,但不可交互,直到onResume()。 - onResume(): Fragment开始交互。 - onPause(): Fragment不再交互,但可能仍然可见。 - onStop(): Fragment不再可见。 所以,正确的方法应该是onStart()和onPause()。当Fragment变得可见但不可交互时,调用的是onStart(),当失去交互能力但仍可见时,调用的是onPause()。 因此,用户的问题的答案是:Fragment可见但不可交互时调用的方法为onStart()(进入可见状态)和onPause()(离开可交互状态)。但用户可能需要具体的某个方法,比如当Fragment变为可见但不可交互时调用的方法是onStart(),而当其变为不可交互但仍可见时是onPause()。 所以,用户的问题的答案应该是onStart()和onPause()这两个方法对应不同的阶段。但需要明确用户的问题场景。 用户的问题可能是指当Fragment从不可见变为可见但还没准备好交互时调用的方法,这时候是onStart()。或者当Fragment处于可见但被暂停(比如另一个Activity覆盖)时调用onPause()。 因此,回答中需要说明这两个方法分别对应的阶段。</think>在Fragment生命周期中,以下方法涉及可见性与交互状态的变化: 1. **`onStart()`** - 当Fragment可见但**尚未可交互**时调用。此时视图已加载到界面中,但Fragment尚未处于前台活跃状态[^2]。 2. **`onPause()`** - 当Fragment**失去交互能力但仍可见**时调用。例如Activity被部分遮挡(如弹出对话框),此时Fragment视图仍然可见,但无法响应用户操作[^1]。 --- ### 具体说明 - **从不可见到可见但不可交互**:通过`onStart()`标记可见性,但需等待`onResume()`后才能交互。 - **从可交互到不可交互但仍可见**:通过`onPause()`标记失去焦点,但视图可能仍保留在屏幕上。 --- ### 示例代码 ```kotlin override fun onStart() { super.onStart() // 可见但不可交互,初始化非UI相关操作 } override fun onPause() { super.onPause() // 失去交互能力,但可能仍可见,需暂停动画或释放资源 } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值