版权声明:本文为博主原创文章,未经博主允许不得转载。
微博:厉圣杰
源码:AndroidDemo/Fragment
文中如有纰漏,欢迎大家留言指出。
之前写过一篇关于 Fragment 生命周期的文章,针对 Fragment 各种情况下的生命周期进行了讨论,这段时间对 Fragment 的使用次数逐渐增加,对 Fragment 也有一定的了解,写此文以做总结。本文中使用 support library v4 包中的 Fragment。
本文大致会从以下几个方面对 Fragment 进行总结,如有不当之处,欢迎指出~
Fragment 简介
Fragment 是在 Android 3.0 中引入,主要用于在大屏设备(如平板电脑)上支持更多动态和灵活的 UI 设计。 因为平板的屏幕比手机屏幕大得多,所以有更多的空间放更多的 UI 控件,也会产生更多的交互。Fragment 可以将 Activity 中的 UI 划分到自身,以实现在多个 Activity 中重用。
下图来自 Android 官方文档,很好的说明了 Fragment 的设计理念:
当在平板电脑上运行时,App 可以在 Activity A 中嵌入 2 个 Fragment。当用户在 Fragment A 中选中某个 Item 时就可以直接在 Fragment B 中展示内容。而在手机等小屏幕设备上,由于没有足够的空间,Activity A 只能展示 Fragment A,并且只能通过启动 Activity B 才能展示选中 Item 的内容。
Fragment 有自己的布局,有自己的生命周期,有自己的响应事件。但 Fragment 又依赖于 Activity 的存在,你可以把多个 Fragment 嵌入到一个 Activity 中或者多个 Activity 重用一个 Fragment。Activity 的生命周期直接影响 Fragment 的生命周期。在 Activity 运行过程中,可以添加、移除或者替换Fragment。
Fragment 使用比较多的直接子类有:
DialogFragment:一种特殊的 Fragment ,可以创建类似 Dialog 的对话框。
因为是 Fragment ,所以可以管理其生命周期。官方推荐使用。
ListFragment:类似于 ListActivity
PreferenceFragment:类似于 PreferenceActivity
关于 Fragment 子类的使用方式本文不在赘述,有兴趣的可以自行上网搜索~
Fragment 的创建
Fragment 可以通过 XML 静态添加,也可以通过代码动态添加,而动态添加又可以分为通过 new 一个Fragment 和通过 newInstance() 生成一个 Fragment 实例。
静态添加Fragment
首先,我们创建一个布局文件 fragment_test.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"
android:orientation="vertical">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="This is a Fragment"
android:textSize="20sp" />
</LinearLayout>
然后创建 TestFragment
,该类继承作者自己封装的 BaseFragment
,与系统自带的 Fragment 有些许差异,但不影响理解
public class TestFragment extends BaseFragment {
@BindView(R.id.tv_content)
TextView mTvContent;
private String mTitle;
private int mBgColor;
public static TestFragment newInstance(String title, int bgColor) {
Bundle args = new Bundle();
TestFragment fragment = new TestFragment();
args.putString(Constant.EXTRA_TITLE, title);
args.putInt(Constant.EXTRA_COLOR, bgColor);
fragment.setArguments(args);
return fragment;
}
@Override
protected int getPageLayoutID() {
return R.layout.fragment_test;
}
@Override
protected void initData() {
if (getArguments() == null) {
return;
}
mTitle = getArguments().getString(Constant.EXTRA_TITLE);
mBgColor = getArguments().getInt(Constant.EXTRA_COLOR);
}
@Override
protected void initView(View view, Bundle savedInstanceState) {
if (!TextUtils.isEmpty(mTitle)) {
mTvContent.setText(mTitle);
}
mTvContent.setBackgroundColor(mBgColor);
}
@Override
protected void initViewListener() {}
@Override
protected void process(Bundle savedInstanceState) {}
}
接下去,在 Activity 的布局文件中添加 TestFragment
即可,使用方法与普通控件相似。
activity_static_create.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_static_create"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.littlejie.demo.modules.base.fragment.create.StaticCreateActivity">
<!-- name 属性用于指定使用哪个 Fragment -->
<fragment
android:name="com.littlejie.demo.modules.base.fragment.create.TestFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Activity 布局相对简单,这里就不再展示代码。运行效果如下:
<