一.Fragment说明
Fragment俗称碎片,Activity界面中的一部分,可理解为模块化的Activity
Fragment不能独立存在,必须嵌入到Activity中
Fragment具有自己的生命周期,接收它自己的事件,并可以在Activity运行时被添加或删除
Fragment的生命周期直接受所在的Activity的影响。如:当Activity暂停时,它拥有的所有Fragment们都暂停
Fragment的使用次数是不输于其他四大组件的,而且Fragment有自己的生命周期,比Activity更加节省内存。
Fragment的优势
- 模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
- 可重用(Reusability):多个Activity可以重用一个Fragment。
- 可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。
二.创建Fragment
在包下new选择Fragment下的Fragment(blank)
新建时将两个复选框取消
这样就创建完成,而且自带xml布局文件
三.加载布局文件
加载布局文件又两种方式
- 静态加载,在Activity的布局文件中使用fragment标签
- 动态加载,通过java代码加载
1.静态加载
Fragment
public class BlankFragment extends Fragment {
public BlankFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank, container, false);
}
}
创建文件时自带的fragment布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BlankFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="123456" />
</FrameLayout>
在Activity的布局文件中直接引用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Main4Activity">
<fragment
android:id="@+id/f1"
android:name="com.example.day2_22.BlankFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
其中name属性为全路径
效果展示
2.动态加载
在动态加载中,就是
1.获取碎片管理者
2.创建事务
3.创建碎片
4.对碎片进行操作
5.提交数据
fragmentTransaction的四个常用方法
- add:将碎片添加到布局
- remove:如果布局中已经添加过碎片,则从布局中移除该碎片
- hide:必须是已经添加过的碎片,从布局中隐藏该碎片
- replace:将布局中的某一控件替换成碎片
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main4);
initViews();
}
private void initViews() {
FragmentManager supportFragmentManager = getSupportFragmentManager();//获取碎片管理者
FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();//创建事务
BlankFragment blankFragment = new BlankFragment();//创建碎片
fragmentTransaction.add(R.id.content_layout,blankFragment);//添加到布局里
fragmentTransaction.remove(blankFragment);//从布局中移除碎片
fragmentTransaction.replace(R.id.content_layout,blankFragment);//将布局中的一块替换
fragmentTransaction.hide(blankFragment);//隐藏掉布局中的碎片
fragmentTransaction.commit();//提交事务
}
四.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相绑定,它也不再拥有视图层次结构,它的所有资源都将被释放。
要开心加油