一、Fragment 概述
Fragment 是从 Android 3.0 开始引入的,翻译过来就是碎片的意思。Fragment 的作用以及使用场景我就不赘述了,这篇博文我们就主要讲 Fragment 的创建、替换与移除这三个操作,至于 Fragment 的生命周期、如何与 Activity 进行通信等内容我们会在后面陆续讲到的。
一、Fragment 的创建
要使用 Fragment,可以通过继承 Fragment 类来创建 Fragment,在多数情况下我们需要给 Fragment 定制一个 UI,但是,也可以为 Activity 创建一个没有 UI,只提供后台行为的 Fragment。Fragment 的创建一般有两种方式:
通过 xml 标签创建,即静态添加 Fragment;通过 java 代码动态创建,即动态添加 Fragment。
1.1、通过 xml 标签静态添加 Fragment(不常用)
在 IndexActivity 的 activity_index 布局中加入 fragment 标签,并通过 name 关联到相应的 Fragment;<?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
:layout_width
="match_parent"
android
:layout_height
="match_parent"
android
:orientation
="vertical"
tools
:context
=".IndexActivity">
<fragment
android
:id
="@+id/fragment_center"
android
:name
="com.zjgsu.fragmentdemo.fragment.CenterFragment"
android
:layout_width
="match_parent"
android
:layout_height
="0dp"
android
:layout_weight
="5" />
<fragment
android
:id
="@+id/fragment_bottom"
android
:name
="com.zjgsu.fragmentdemo.fragment.BottomFragment"
android
:layout_width
="match_parent"
android
:layout_height
="0dp"
android
:layout_weight
="1" />
</LinearLayout
>
创建 CenterFragment;public class CenterFragment extends Fragment {
@Nullable
@Override
public View
onCreateView(@NonNull LayoutInflater inflater
, @Nullable ViewGroup container
, @Nullable Bundle savedInstanceState
) {
View view
= inflater
.inflate(R
.layout
.fragment_center
, container
, false);
return view
;
}
}
创建 BottomFragment;
public class BottomFragment extends Fragment {
@Nullable
@Override
public View
onCreateView(@NonNull LayoutInflater inflater
, @Nullable ViewGroup container
, @Nullable Bundle savedInstanceState
) {
View view
= inflater
.inflate(R
.layout
.fragment_bottom
, container
, false);
return view
;
}
}
然后我们启动 IndexActivity 就可以看到效果了。
1.2、通过 Java 代码动态添加 Fragment
动态添加 Fragment 则不需要在 IndexActivity 的 activity_index 布局中加入 fragment 标签;<?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
:layout_width
="match_parent"
android
:layout_height
="match_parent"
android
:orientation
="vertical"
tools
:context
=".IndexActivity">
<FrameLayout
android
:id
="@+id/layout_center"
android
:layout_width
="match_parent"
android
:layout_height
="0dp"
android
:layout_weight
="5" />
<FrameLayout
android
:id
="@+id/layout_bottom"
android
:layout_width
="match_parent"
android
:layout_height
="0dp"
android
:layout_weight
="1" />
</LinearLayout
>
动态添加 Fragment 主要涉及 FragmentManager 和 FragmentTransaction 这两个操作对象。public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState
) {
super.onCreate(savedInstanceState
);
setContentView(R
.layout
.activity_index
);
FragmentManager fragmentManager
= getSupportFragmentManager();
FragmentTransaction fragmentTransaction
= fragmentManager
.beginTransaction();
fragmentTransaction
.add(R
.id
.layout_center
, new CenterFragment());
fragmentTransaction
.add(R
.id
.layout_bottom
, new BottomFragment());
fragmentTransaction
.commit();
}
}
二、Fragment 的替换与移除
Fragment 的替换与移除也都是通过 FragmentManager 和 FragmentTransaction 来完成的。
我们先来看下效果: 具体代码如下所示
public class Index2Activity extends AppCompatActivity implements View.OnClickListener {
private Button btnReplace
;
private Button btnRemove
;
private FirstFragment f1
;
private SecondFragment f2
;
@Override
protected void onCreate(Bundle savedInstanceState
) {
super.onCreate(savedInstanceState
);
setContentView(R
.layout
.activity_index2
);
initView();
}
private void initView() {
btnReplace
= findViewById(R
.id
.btn_replace
);
btnRemove
= findViewById(R
.id
.btn_remove
);
btnReplace
.setOnClickListener(this);
btnRemove
.setOnClickListener(this);
initFragment();
}
private void initFragment() {
f1
= new FirstFragment();
f2
= new SecondFragment();
addFragment();
}
private void addFragment() {
getSupportFragmentManager()
.beginTransaction()
.add(R
.id
.layout_container
, f1
)
.commit();
}
@Override
public void onClick(View v
) {
switch (v
.getId()) {
case R
.id
.btn_replace
:
getSupportFragmentManager()
.beginTransaction()
.replace(R
.id
.layout_container
, f2
)
.addToBackStack(null
)
.commit();
break;
case R
.id
.btn_remove
:
getSupportFragmentManager()
.beginTransaction()
.remove(f2
)
.commit();
break;
}
}
}
三、源码
源码已经上传至 github,下一篇博文我们讲 Fragment 与 Activity之间的通信。