Fragment

Fragment 表示用户界面的一部分。可以在一个Activity中混合多个Fragment,也可在多个Activiy中重用Fragment。 Fragment必须嵌入到Activity中可使用,它的声明周期直接受到所在Activiy的生命周期的影响。当Acitiviy暂停时,所有的Fragment也暂停;当Activity销毁时,所有的Fragment也会销毁;然而当一个Activity正在运行时,可以独立的控制每个Fragment,比如添加或移除。

Activity管理了一个back stack,这个栈中的记录了每个Fragment Transaction,当按Back按钮时,自动从back stack中取回一个Fragment Transaction。

创建Fragment

通过继承Fragment或其子类来创建一个Fragment。系统内置了一些Fragment。

添加用户界面

public static class ExampleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.example_fragment, container, false);
    }
}

将Fragment添加到Activity

在布局文件中使用Fragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

编程添加Fragment

FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

添加一个没有UI的Fragment

直接调用Activity的add(Fragment, String) ,注意第个二参数是一个字符串的Tag。可通过findFragmentByTag()查找这个Fragment。

管理Fragment

在Activity中调用getFragmentManager()获得FragmentManager来管理Fragment。

FragmentManager主要功能有:

  • 获取存在于Activity中的Fragment,可使用findFragmentById()(适用于有UI的Fragment)、findFragmentByTag()(适用于没有UI的Frament)
  • 使用popBackStack()从back stack中弹出Fragment(模拟Back按钮)
  • 使用addOnBackStackChangedListener()注册一个监听器监听back stack的变化
  • 使用beginTransaction()打开一个FragmentTransaction

Fragment Transaction

开始事务

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

执行修改并提前事务

可使用add()、remove()、replace()执行任意次修改,然后使用commit()提交事件。

在提前事务之前可能需要调用addToBackStack()将该事务添加到back stack中。

如果没有调用addToBackStack(),当移除一个Framengt时,在事务提前后,这个Fragment会被销毁;如果调用了addtoBAckStack(),当移除一个Fragment时,该Fragment会变成stopped状态。

提示:对于每个Fragment Transaction,可在commit之前调用setTransition()应用transition annimation。

Fragment和Activity交互

在Fragment中调用getActivity()获取所在的Activity。

在Activity中可通过FragmentManager查找Fragment

在Fragment中回调Activiy中的方法

public static class FragmentA extends ListFragment {
    ...
    // Container Activity must implement this interface
    public interface OnArticleSelectedListener {
        public void onArticleSelected(Uri articleUri);
    }

      OnArticleSelectedListener mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnArticleSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Append the clicked item's row ID with the content provider Uri
        Uri noteUri = ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id);
        // Send the event and Uri to the host activity
        mListener.onArticleSelected(noteUri);
    }
    ...


}

results matching ""

    No results matching ""