** fragment的生命周期**
onAttach:onAttach()在fragment与Activity关联之后调调查用。需要注意的是,初始化fragment参数可以从getArguments()获得,但是,当Fragment附加到Activity之后,就无法再调用setArguments()。所以除了在最开始时,其它时间都无法向初始化参数添加内容。
onCreate:fragment初次创建时调用。尽管它看起来像是Activity的OnCreate()函数,但这个只是用来创建Fragment的。此时的Activity还没有创建完成,因为我们的Fragment也是Activity创建的一部分。所以如果你想在这里使用Activity中的一些资源,将会获取不到。比如:获取同一个Activity中其它Frament的控件实例。(代码如下:),如果想要获得Activity相关联的资源,必须在onActivityCreated中获取。
onCreateView:在这个fragment构造它的用户接口视图(即布局)时调用。
onActivityCreated:在Activity的OnCreate()结束后,会调用此方法。所以到这里的时候,Activity已经创建完成!在这个函数中才可以使用Activity的所有资源。如果把下面的代码放在这里,获取到的btn_Try的值将不会再是空的!
onStart:当到OnStart()时,Fragment对用户就是可见的了。但用户还未开始与Fragment交互。在生命周期中也可以看到Fragment的OnStart()过程与Activity的OnStart()过程是绑定的。意义即是一样的。以前你写在Activity的OnStart()中来处理的代码,用Fragment来实现时,依然可以放在OnStart()中来处理。
onResume:当这个fragment对用户可见并且正在运行时调用。这是Fragment与用户交互之前的最后一个回调。从生命周期对比中,可以看到,Fragment的OnResume与Activity的OnResume是相互绑定的,意义是一样的。它依赖于包含它的activity的Activity.onResume。当OnResume()结束后,就可以正式与用户交互了。
onPause:此回调与Activity的OnPause()相绑定,与Activity的OnPause()意义一样。
onStop:这个回调与Activity的OnStop()相绑定,意义一样。已停止的Fragment可以直接返回到OnStart()回调,然后调用OnResume()。
onDestroyView:如果Fragment即将被结束或保存,那么撤销方向上的下一个回调将是onDestoryView()。会将在onCreateView创建的视图与这个fragment分离。下次这个fragment若要显示,那么将会创建新视图。这会在onStop之后和onDestroy之前调用。这个方法的调用同onCreateView是否返回非null视图无关。它会潜在的在这个视图状态被保存之后以及它被它的父视图回收之前调用。
onDestroy:当这个fragment不再使用时调用。需要注意的是,它即使经过了onDestroy()阶段,但仍然能从Activity中找到,因为它还没有Detach。
onDetach:Fragment生命周期中最后一个回调是onDetach()。调用它以后,Fragment就不再与Activity相绑定,它也不再拥有视图层次结构,它的所有资源都将被释放。
** fragment的优点**
Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。
Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。
Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。
Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。
Fragment 解决Activity间的切换不流畅,轻量切换。
Fragment 替代TabActivity做导航,性能更好。
Fragment 在4.2.版本中新增嵌套fragmeng使用方法,能够生成更好的界面效果。
Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,提高性能
**Fragment 如何实现类似Activity任务栈的压栈和出栈**
往Activity中添加Fragment默认是不会添加到任务栈的,不会有Activity那种压栈和出栈的效果。
如果要实现这种效果,我们可以通过以下步骤实现:
1.添加Fragment的时候通过fragmentTransaction.addToBBackStack(String)方法,来讲Fragment添加到任务栈中。
2.在要退出Fragment的时候,先通过fragmentManager.getBackStackEntryCount()方法获取栈中Fragment的数量。
3.如果当前任务栈中的Fragment只有一个的时候,我们按后退键就直接退出Activity。如果数量大于1,则调用fragmentManager.popBackStack(String name, int flags)或者fragmentManager.popBackStack(int id, int flags)方法将Fragment弹出栈
**Fragment与activity的通信 **
1.接口回调方式
在fragment中定义一个回调接口,有Activity去实现接口,进行通信
2.碎片中通过getActivity方法来获取实例,进行findByID来进行通信(前提是此fragment是跟Activity关联的)
fragment中直接调用Activity中公开静态变量
View listView = getActivity().findViewById(R.id.list);
3.同样可以获取getFragment实例,通过findByID进行关联通信
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
4.引入Bundle
Bundle bundle=new Bundle();
bundle.putString("name","张三");
benFragment.setArguments(bundle);
这样传入值后就直接去fragment去接收
Bundle bundle=getArguments();
String name=bundle.getString("name");
button.setText(name)
**Fragment与Fragment的通信 **
1.在fragment中定义一个接口回调
public void getEditText(CallBack callBack) {
String msg = editText.getText().toString();
callBack.getResult(msg);
}
public interface CallBack {
public void getResult(String result);
}
在Activity中回调方法进行赋值
//点击按钮后,通过接口回调,获取fragment当中EditText的值,并弹出吐司
leftFragment.getEditText(new CallBack(){
@Override
public void getResult(String result) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, result, 1).show();
}
**FragmentPagerAdapter和FragmentStatePagerAdapter的区别**
FragmentPagerAdapter 一次会把所有的Fragment都加载,适用于数据量少,页面少,常用的fragment,像tab标签页这样的,可以用FragmentPagerAdapter。划过的fragment,尽管视图不见了,但是会把他们保存在内存里,方便调用,因此这会占用大量的内存空间。数据过多会发生状态丢失。
FragmentStatePagerAdapter 如果有大量的fragment,或者fragment中有大量的数据(Bitmap)就用fragmentStatePagerAdater,和 FragmentPagerAdapter 不一样的是,正如其类名中的 'State' 所表明的含义一样,该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源,而在页面需要显示时,生成新的页面,它就像listview一样,当fragment不可见时候,仅仅保存fragment的状态,相对上面的而言,这会占用较少的内存,不会发生状态丢失。
** Fragment的复用**
复用就是产生多个界面要展示不同数据的时候,且在一个Activity中展示,一般应用为Tab栏下切换的界面(fragment)
复用的好处:
避免显示错乱
避免重复添加
避免多余的内存占用
优化界面启动速度
网友评论