一、概述
1.1 基本概念
2.1 Fragment VS Activity
- 一个Activity可以运行多个Fragment
- Fragment不能脱离activity而存在
- activity是屏幕的主体,而Fragment是activity的一个组成元素
2.3 声明周期
1 周期图
-
周期图
-
对比activity和Fragment
2. 各种操作
- 创建任务
- 点击HOME键 周期先是暂停,在停止,并没有销毁,还在后台保留
-
从主界面打开任务界面
这个周期是先启动,让后就从新开始了 -
在试下在任务界面点返回键
任务周期先为暂停状态,然后为销毁状态
- 接着试下旋转屏幕会发生什么
可以看到执行了较多的生命周期方法,大致意思就是这个任务先是暂停了,然后就销毁,重新调用了回调函数,创建了新的视图,创建成功后,就重新开始了
- 在试下在任务界面直接多任务切换回来
这个过程就相当于点返回键,在多任务切换回任务界面
二、静态加载 VS 动态加载
2.1 静态加载:xml
2.2 动态加载
- 步骤1:在Activity的布局文件定义占位符
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/about_fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
- 步骤2:设置Fragment的布局文件
example_fragment.xml
<LinearLayout 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"
android:orientation="vertical" >
<TextView
android:text="@string/example_fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
- 步骤3:在Activity的.java文件中动态添加Fragment
public class FragmentTransactionTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_transaction_test);
// 步骤1:获取FragmentManager
FragmentManager fragmentManager = getFragmentManager();
// 步骤2:获取FragmentTransaction
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 步骤3:创建需要添加的Fragment :ExampleFragment
ExampleFragment fragment = new ExampleFragment();
// 步骤4:动态添加fragment
// 即将创建的fragment添加到Activity布局文件中定义的占位符中(FrameLayout)
fragmentTransaction.add(R.id.about_fragment_container, fragment);
fragmentTransaction.commit();
}
// 继承与Fragment
public static class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.example_fragment, container, false);
// 将example_fragment.xml作为该Fragment的布局文件
}
}
}
- 敏捷方式
// activity--->fragment value
// 1. 创建需要添加的Fragment :ExampleFragment
ExampleFragment fragment = new ExampleFragment();
// 2:动态添加fragment
getSupportFragmentManager()
.beginTransaction()
.add(R.id.about_fragment_container, fragment)
.commit();
listFragment.setOnTitleClickListener(this);
2.3 动态切换实例
FragmentManager
要管理Activity中的Fragments,就需要使用FragmentManager类。通过getFragmentManager()或getSupportFragmentManager()获得 。
findFragmentById(int id):根据ID来找到对应的Fragment实例,主要用在静态添加Fragment的布局中,因为静态添加的Fragment才会有IDfindFragmentByTag(String tag):根据TAG找到对应的Fragment实例,主要用于在动态添加的Fragment中,根据TAG来找到Fragment实例getFragments()|获取所有被add进Activity中的Fragment 实例。benginTransatcion():开启一个事物。
FragmentTransaction
如果需要添加、删除、替换Fragment,则需要借助于FragmentTransaction对象,FragmentTransaction 代表 Activity 对 Fragment 执行的多个改变。
-
add(int containerViewId, Fragment fragment, String tag)将一个Fragment实例添加到Activity的最上层 。 -
remove(Fragment fragment):将一个Fragment实例从Activity的Fragment队列中删除。 -
replace(int containerViewId, Fragment fragment):替换containerViewId中的Fragment实例。注意,它首先把containerViewId中所有Fagment删除,然后再add进去当前的Fragment 实例。 -
hide(Fragment fragment):隐藏当前的Fragment,仅仅是设为不可见,并不会销毁。 -
show(Fragment fragment):显示之前隐藏的Fragment。 -
detach(Fragment fragment):会将view从UI中移除,和remove()不同,此时Fragment的状态依然由FragmentManager维护。 -
attach(Fragment fragment):重建view视图,附加到UI上并显示。 -
commit():提交一个事务。
// 找到校长
FragmentManager fragmentManager = getSupportFragmentManager();
// 找到秘书
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 创建一个fragment
TestFragment testFragment = TestFragment.newInstance(null, null);
// 只需commit一次
fragmentTransaction.add(R.id.fragment_view, testFragment);
// 最后要commit,向校长汇报
fragmentTransaction.remove(testFragment).commit();