目录
1.Fragment简述
2.Fragment使用
3.Fragment与Activity交互
4.Fragment与Activity的生命周期
Fragment简述
Fragment是在Android 3.0 (API level 11)开始引入的,它能让你的app在现有基础上性能大幅度提高,并且占用内存降低,同样的界面Activity占用内存比Fragment要多,响应速度Fragment比Activty在中低端手机上快了很多,甚至能达到好几倍,"单Activity + 多Fragment架构"和"多模块Activity + 多Fragment架构"应运而生
Fragment使用
1.编写Fragment布局
创建fragment01.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fragment01"/>
</LinearLayout>
2.创建Fragment的子类
通常, 应当至少实现如下的生命周期方法:
onCreate()
当创建fragment时, 系统调用该方法.
在实现代码中,应当初始化想要在fragment中保持的必要组件, 当fragment被暂停或者停止后可以恢复.
onCreateView()
fragment第一次绘制它的用户界面的时候, 系统会调用此方法. 为了绘制fragment的UI,此方法必须返回一个View, 这个view是你的fragment布局的根view. 如果fragment不提供UI, 可以返回null.
onPause()
用户将要离开fragment时,系统调用这个方法作为第一个指示(然而它不总是意味着fragment将被销毁.) 在当前用户会话结束之前,通常应当在这里提交任何应该持久化的变化(因为用户有可能不会返回).
创建Fragment01,因为例子中fragment01布局简单,所以只实现了onCreateView()
public class Fragment01 extends Fragment {
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment01,container,false);
return view;
}
}
3.将Fragment添加到Activity中
将Fragment添加到Activity中有两种方式,一种是在在activity的layout文件中声明fragment;另一种是动态添加,下面讲动态添加方法。
动态添加Fragment时,需要在Activity的layout文件中声明一个ViewGroup。当activity运行的任何时候, 都可以将fragment添加到ViewGroup。
Activity布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt_fragment01"
android:text="fragment01"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt_fragment02"
android:text="fragment02"/>
</LinearLayout>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
Activity逻辑如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
}
private void initView(){
Button bt_fragment01 = findViewById(R.id.bt_fragment01);
Button bt_fragment02 = findViewById(R.id.bt_fragment02);
bt_fragment01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Fragment01 fragment01 = new Fragment01();
addFragment(fragment01);
}
});
bt_fragment02.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Fragment02 fragment02 = new Fragment02();
addFragment(fragment02);
}
});
}
private void addFragment(Fragment fragment){
//1.获取到FragmentManager,在V4包中通过getSupportFragmentManager
//在系统中原生的Fragment是通过getFragmentManager获得的。
android.support.v4.app.FragmentManager FM = getSupportFragmentManager();
//2.开启一个事务,通过调用beginTransaction方法开启。
FragmentTransaction fragmentTransaction =FM.beginTransaction();
//3.向容器内加入Fragment,一般使用add或者replace方法实现,需要传入容器的id和Fragment的实例。使用replace可以防止fragment重叠
fragmentTransaction.replace(R.id.fragment_container,fragment);
//4.提交事务,调用commit方法提交。
fragmentTransaction.commit();
}
}
Fragment动态添加到Activity步骤:
1.获取到FragmentManager
2.开启一个事务
3.向容器内加入Fragment
4.提交事务
注意事项:
在使用fragmentTransaction.add()向容器添加fragment时,如果布局文件已经添加了fragment,再次添加,会出现重叠现象,而使用replace不会。
Fragment与Activity交互
尽管Fragment被实现为一个独立于Activity的对象,并且可以在多个activity中使用,但一个给定的fragment实例是直接绑定到包含它的activity的. 特别的,fragment可以使用 getActivity() 访问Activity实例, 并且容易地执行比如在activity layout中查找一个view的任务.
View listView =getActivity().findViewById(R.id.list);
同样地,activity可以通过从FragmentManager获得一个到Fragment的引用来调用fragment中的方法, 使用findFragmentById() 或 findFragmentByTag().
ExampleFragment fragment (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment)
Fragment与Activity数据交互参考:
https://blog.csdn.net/chenliguan/article/details/53906934
https://www.jianshu.com/p/1b824e26105b
Fragment与Activity的生命周期
fragment所生存的activity的生命周期,直接影响fragment的生命周期,每一个activity的生命周期的回调行为都会引起每一个fragment中类似的回调.
例如,当activity接收到onPause()时,activity中的每一个fragment都会接收到onPause().
Fragment 有一些额外的生命周期回调方法, 那些是处理与activity的唯一的交互,为了执行例如创建和销毁fragment的UI的动作. 这些额外的回调方法是:
onAttach()
当fragment被绑定到activity时被调用(Activity会被传入.).
onCreateView()
创建和fragment关联的view hierarchy时调用.
onActivityCreated()
当activity的onCreate()方法返回时被调用.
onDestroyView()
当和fragment关联的view hierarchy正在被移除时调用.
onDetach()
当fragment从activity解除关联时被调用.