API拾遗录之Fragment

Fragment必须内嵌到activity中,它不能单独使用,并且它的生命周期受到activity生命周期的制约——当activity暂停时,所有的fragment暂停,当activity停止时,所有的fragment停止。只有当activity处于运行态(resumed in lifecycle state)时,才可以单独操作各个fragment,比如添加或删除。在fragment事件中,activity管理着一个fragment返回栈。

在activity的layout中,fragment存在于activity的一个ViewGroup内。并且fragment定义了自己的view布局。有两种方式添加fragment布局——一是在activity layout中使用<fragment>标签。或者在代码中添加到一个ViewGroup中。当然,fragment也可以以没有UI的方式存在。

Creating a Fragment

创建一个Fragment的方法,同创建activity一样,需要创建一个继承自Fragment类或其子类的一个类,并实现onCreate(),onStart()等必要的回调方法。

Fragment生命周期和其对应的生命周期回调方法以及它和activity生命周期的关系图如下:

同activity一样,fragment也有三种存活状态。

Resumed                       fragment在activity运行时处于可见位置

Paused                           另一个activity处于前台获得焦点,但fragment所在的activity仍是可见的,未被完全覆盖。

Stopped                          fragment完全不可见。出现这种情况有两种可能,一是activity处于停止状态,二是fragment从activity中删除掉加入到返回栈中。一个停止态的fragment仍处于激活态(它的所有状态和成员信息由系统保留)。

同activity一样,当activity进程被系统杀死,重新创建fragment后,我们想恢复之前保存的状态,做法是在onSaveInstanceState()中保存相关的数据,而在onCreate(),onCreateView()或者onActivityCreated()中恢复保存的数据。

当activity停止时,它被自动保存在一个由系统管理的返回栈中,用户可以点击返回按钮回到这个activity。然而,fragment被保存在一个由activity管理的返回栈中,当去除fragment时,我们必须显式的调用addToBackStack()才能把它保存在返回栈中。


fragment的生命周期受到activity生命周期的直接影响。比如,当activity接收onPause()时,该activity中的每个fragment都会接收onPause()。需要指出的是fragment中新有的几个回调函数。

onAttach()                         fragment被绑定到activity时调用。

onCreateView()               创建fragment布局视图时调用。

onActivityCreated()         当activity的onCreate()方法返回时调用。

onDestroyView()              fragment视图删除时调用。

onDetach()                        fragment从activity中解除绑定时调用。


Communicating with the Activity

尽管Fragment对象独立于activity对象,它可以被使用于多个activity中,一个给定的fragment实例还是直接被绑定到包含它的activity实例中的。

在fragment中通过getActivity()可以获取activity实例,然后与activity中的成员进行交互操作。

比如:

View listView = getActivity().findViewById(R.id.list);

同样的,activity可以通过FragmentManager获取fragment的引用,例如:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

Creating event callbacks to the activity

在一些实例中,可能需要fragment和activity共享events。一个好的方法是在fragment中定义回调接口,而在activity中实现它。当activity通过接口获得回调时,它就可以与其它fragment在必要的时候共享信息。

例如:一个activity中有两个fragment。一个显示文章列表(fragment A),一个显示具体的文章内容(fragment B)。A必须告知activity用户选取了哪一篇文章,然后B从activity中获知这一信息以显示对应的文章内容。在这一实例中,OnArticleSelectedListener接口在A中声明:

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");
        }
    }
    ...
}

在activity中我们需要实现这个OnArticleSelectedListener接口,并复写onArticleSelected()函数通知B响应响应的事件。为了保证activity实现了这一接口,A的onAttach()回调初始化了OnArticleSelectedListener接口把activity传递过来。

Adding items to the Action Bar

通过onCreateOptionsMenu(),fragment可以为activity的Options Menu提供菜单项。为了确保这一方法成功实现回调。必须在onCreate()期间调用setHasOptionsMenu()告知Options Menu fragment要添加菜单项。

通过fragment添加的菜单会添加在已有菜单之后。选中菜单项时,fragment也会接收onOptionsItemSelected()回调。

通过registerForContextMenu()注册,onCreateContextMenu()接收用户打开信息,onContextItemSelected()接收用户点击信息可以实现Context Menu。

用户点击菜单的信息首先传递给activity,如果activity不处理,则传递给fragment。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值