碎片可以看成是一种特殊的活动,也就是特殊的页面。

写一个碎片

碎片和活动一样,用来写页面,页面或一个java类和一个布局文件组成。

写碎片布局

在 layout 目录下创建 fragment_index.xml 文件。

  1. <FrameLayout android:layout_width="match_parent"
  2. android:layout_height="match_parent"
  3. xmlns:android="http://schemas.android.com/apk/res/android">
  4. <TextView
  5. android:layout_width="match_parent"
  6. android:layout_height="wrap_content"
  7. android:text="首页"/>
  8. </FrameLayout>

写java类

普通的 java 类怎样会被认为是一个碎片呢?只需要继承 Fragment 类,并且实现它的 onCreateView 方法即可,在该方法中将碎片布局文件与类进行绑定。

  1. public class IndexFragment extends Fragment {
  2. @Nullable
  3. @Override
  4. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  5. View view = inflater.inflate(R.layout.fragment_index, container, false);
  6. return view;
  7. }
  8. }

用一个碎片

碎片定义好,怎么使用?在活动布局文件中直接用 fragment 控件,并且设置 name 属性指向碎片 java 类位置。

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent">
  4. <fragment
  5. android:name="top.dkvirus.novel.pages.index.IndexFragment"
  6. android:layout_width="match_parent"
  7. android:layout_height="wrap_content"/>
  8. </LinearLayout>

动态替换碎片

  1. private void replaceFragment (Fragment fragment) {
  2. FragmentManager manager = getSupportFragmentManager();
  3. FragmentTransaction transaction = manager.beginTransaction();
  4. transaction.replace(R.id.wrapper, fragment);
  5. transaction.commit();
  6. }
  7. // 要替换碎片只需调用 replaceFragment(new IndexFragment());

活动与碎片之间通信

在活动中获取碎片

在活动中拿到碎片就可以调用碎片内的方法了。

  1. IndexFragment fragment = (IndexFragment) getFragmentManager()
  2. .findFragmentById(R.id.fragment_index);

在碎片中获取活动

  1. MainActivity activity = (MainActivity) getActivity();