碎片可以看成是一种特殊的活动,也就是特殊的页面。
写一个碎片
碎片和活动一样,用来写页面,页面或一个java类和一个布局文件组成。
写碎片布局
在 layout 目录下创建 fragment_index.xml 文件。
<FrameLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="首页"/>
</FrameLayout>
写java类
普通的 java 类怎样会被认为是一个碎片呢?只需要继承 Fragment 类,并且实现它的 onCreateView 方法即可,在该方法中将碎片布局文件与类进行绑定。
public class IndexFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_index, container, false);
return view;
}
}
用一个碎片
碎片定义好,怎么使用?在活动布局文件中直接用 fragment 控件,并且设置 name 属性指向碎片 java 类位置。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:name="top.dkvirus.novel.pages.index.IndexFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
动态替换碎片
private void replaceFragment (Fragment fragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.wrapper, fragment);
transaction.commit();
}
// 要替换碎片只需调用 replaceFragment(new IndexFragment());
活动与碎片之间通信
在活动中获取碎片
在活动中拿到碎片就可以调用碎片内的方法了。
IndexFragment fragment = (IndexFragment) getFragmentManager()
.findFragmentById(R.id.fragment_index);
在碎片中获取活动
MainActivity activity = (MainActivity) getActivity();