Fragment详解

Fragment详解,第1张

Activity用来管理Fragment。因为一个Fragment可以被多个Activity嵌套,有个共同的业务模块就可以复用了

Fragment具有自己生命周期,是模块化UI的良好组件。

Fragment的生命周期是寄托到Activity中,Fragment可以被Attach添加和Detach释放。

Fragments是view controllers,它们包含可测试的,解耦的业务逻辑块,由于Fragments是构建在views之上的,而views很容易实现动画效果,因此Fragments在屏幕切换时具有更好的控制。

Fragment可以像普通对象那样自由的创建和控制,传递参数更加容易和方便,也不用处理系统相关的事情,显示方式、替换、不管是整体还是部分,都可以做到相应的更改。

可以看出Fragment生命周期与Activity类似

解释如下:

上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。

因为Fragment依赖Activity,那么Fragment和Activity的生命周期可谓是息息相关,如下图所示

Activity的FragmentManager负责调用队列中Fragment的生命周期方法,只要Fragment的状态与Activity的状态保持了同步,托管Activity的FragmentManager便会继续调用其他生命周期方法以继续保持Fragment与Activity的状态一致。

Activity-onCreate(begin) ,Fragment-onAttach-onCreate-onCreateView-onViewCreated, Activity-onCreate(end) ,Fragment-onActivityCreated, Activity-onStart ,Fragment-onStart, Activity-onResume ,Fragment-onResume

Fragment-onPause, Activity-onPause ,Fragment-onStop, Activity-onStop

Activity-onRestart-onStart ,Fragment-onStart, Activity-onResume ,Fragment-onResume

Fragment-onPause, Activity-onPause ,Fragment-onStop, Activity-onStop ,Fragment-onDestroyView-onDestroy-onDetach, Activity-onDestroy

Fragment的管理则交由FragmentActivity的FragmentManager来实现。

获取方式:

注意 :在fragment创建childFragment的时候,需要注意的是:使用getChildFragmentManager() 使用getFragmentManager()会导致内存泄漏

常用API:

popBackStackImmediate相关的方法与上面逻辑是一样的与上面不同的是,在调用的时候会立即执行d出。

通过FragmentTransaction实现在Activity运行时可动态地加入、移除、交换Fragment

FragmentTransaction的主要方法介绍

针对在一个Activity中的某个Layout中切换Fragment,无非两种方法:

当移除或替换一个片段并向返回栈添加事务时,系统会停止(而非销毁)移除的片段。 如果用户执行回退 *** 作进行片段恢复,该片段将重新启动。

具体实例可参看: Fragment的addToBackStack()使用

commit(), commitNow()和commitAllowingStateLoss()区别分析

实例:

使用setArguments(Bundle args)传递,在onCreate中使用getArguments()取出。和Activity的Intent恢复机制类似。

1、如果你需要在Fragment中用到宿主Activity对象,建议在你的基类Fragment定义一个Activity的全局变量,在onAttach中初始化,这不是最好的解决办法,但这可以有效避免一些意外Crash。

2、onHiddenChanged的回调时机

当使用add()+show(),hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged()

推荐阅读: Fragment全解析系列(二):正确的使用姿势 、 Fragment全解析系列(一):那些年踩过的坑

frgment被创建的时候,相关的生命周期,

onAttach(), onCreate(), onCreateView(), onActivityCreated();

fragment对用户可见的时候,相关的生命周期,

onStrat(), onResume(),

fragment进入“后台模式”的时候,相关的生命周期,

onPause(), onStop(),

fragment被销毁的时候,相关的生命周期,

onPause(), onStop(), onDestroyView(), onDestroy(), onDetach()

可用onCreate()、onCreateView()、onActivityCreated()方法Bundle对象保存一个fragment的对象

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解除关联时调用。

不能在onCreate函数中获取控件,以为fragment还没有start,你可以在onStart函数中获取:

@Override

protected void onStart() {

superonStart();

View view = thisfindViewById(RidbtnTest);

viewsetOnClickListener(new androidviewViewOnClickListener(){

public void onClick(androidviewView v) {

//TODO

}

});

}

我之前也遇到这样的问题。

下面,我将解答这两个问题。

答:采用 Bundle 方式。具体Demo步骤如下:

activcity_2_fragmentxml

fragmentxml

Activity2Fragment

mFragmentjava

至此, Activity 传递数据到 Fragment 讲解完毕。

activity_mainxml

fragmentxml

ICallBackjava

mFragmentjava

Main_Activityjava

至此,将数据从 Fragment 发送到 Activity 讲解完毕

不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度

ViewPager的数据是通过PageAdapter来装载的,刷新数据的方法有以下:

调用adapternotifyDataSetChanged(); 刷新控件,但是要覆盖PagerAdapter的getItemPosition方法,并返回 return POSITION_NONE;

利用PagerAdapter的工作机制,就是PagerAdapter的执行顺序, PagerAdapter作为ViewPager的适配器,无论ViewPager有多少页,PagerAdapter在初始化时也只初始化开始的2个View,即调用2次instantiateItem方法。而接下来每当ViewPager滑动时,PagerAdapter都会调用destroyItem方法将距离该页2个步幅以上的那个View销毁,以此保证PagerAdapter最多只管辖3个View,且当前View是3个中的中间一个,如果当前View缺少两边的View,那么就instantiateItem,如里有超过2个步幅的就destroyItem。

每当Adapter调用instantiateItem时,运用ViewsetTag方法将该View标识。当需要更新这个View的数据时,通过调用ViewPagerfindViewWithTag方法找到相应的View,然后更新View中的数据。

   MainActivity 通过 startActivityForResult 启动 MainActivity2 ,同时传递一个 Bundle 对象给 MainActivity2 ,在 MainActivity2 中通过 getIntent 获取到传递过来的 Bundle ,进而得到 MainActivity 传递过来的String 数据并打印。

  在 MainActivity2 中通过 setResult 设置需要传递给 MainActivity 的 Bundle 数据,在 MainActivity 的 onActivityResult 函数中就可以得到相关的 Bundle 数据。

  每一个Android应用都有一个 Application 对象,这个 Application 会贯穿整个Android应用,在其中定义的变量,它的生命周期也是和整个应用的生命周期一样。

  在 MainActivity 中定义了一个 伴生变量 ,它相当于 Java中的静态变量 ,而在 MainActivity2 中可以获取此静态变量,并对其进行修改。

  通过 Fragment 的 setArguments(bundle) 实现 Activity 想 Fragment 传值。

  通过 onAttach(activity: Activity) 方法获得 activity 实例,直接调用 activity 中的方法获得数据。

   Service 的 onBind 方法需要返回一个 Binder 对象,而这个对象在 ServiceConnectiononServiceConnected 中可以获取,从而实现 Service 和 Activity 之间的通信。

   startService 时,传入参数 intent 可以携带部分参数给 Service ,我们可以在 Service 的 onStartCommand 方法中得到 startService 传递过来的 intent 数据。

  在service中持有 callback 接口,并在binder中定义方法得到service的实例。activity中实现 ServiceConnection ,通过绑定启动service,这样会回调 ServiceConnection 接口的 onServiceConnected 方法,从而得到service实例,对service中的 callback 进行赋值,在service中可进行耗时 *** 作并见数据通过callback接口,传递给activity进行其他 *** 作。

除了上面说的常用方法外,还有很多其他方法,比如广播机制,事件总汇(eventbus)等。

以上就是关于Fragment详解全部的内容,包括:Fragment详解、Android的Fragment知识点、如何获取fragment里的控件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9448375.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存