Fragment和Activity的交互

  一个Fragment的实例总是和包括它的Activity直接相关。

  fragment能够通过getActivity() 方法来获得Activity的实例。然后就能够调用一些比如findViewById()之类的方法。

  如:

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

  可是注意调用getActivity()时,fragment必须和activity关联(attached to an activity)。否则将会返回一个null。

  相似的,activity也能够获得一个fragment的引用。从而调用fragment中的方法。

  获得fragment的引用要用FragmentManager。之后能够调用findFragmentById() 或者 findFragmentByTag().

  比方:

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

创建事件回调

  一些情况下,可能须要fragment和activity共享事件,一个比較好的做法是在fragment里面定义一个回调接口。然后要求宿主activity实现它。

  当activity通过这个接口接收到一个回调,它能够同布局中的其它fragment分享这个信息。

  比如,一个新闻显示应用在一个activity中有两个fragment,一个fragment A显示文章题目的列表,一个fragment B显示文章。

  所以当一个文章被选择的时候,fragment A必须通知activity,然后activity通知fragment B,让它显示这篇文章。

  这个情况下,在fragment A中声明一个这种接口OnArticleSelectedListener:

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

  之后包括这个fragment的activity实现这个OnArticleSelectedListener接口。用覆写的onArticleSelected()方法将fragment A中发生的事通知fragment B。

  为了确保宿主activity实现这个接口。fragment A的onAttach() 方法(这种方法在fragment
被增加到activity中时由系统调用)中通过将传入的activity强制类型转换。实例化一个OnArticleSelectedListener对象:

public static class FragmentA extends ListFragment {
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没有实现这个接口。fragment将会抛出ClassCastException异常,假设成功了,mListener将会是activity实现OnArticleSelectedListener接口的一个引用。所以通过调用OnArticleSelectedListener接口的方法,fragment
A能够和activity共享事件。

  比方。假设fragment A是ListFragment的子类,每一次用户点击一个列表项目,系统调用fragment中的onListItemClick() 方法,在这种方法中能够调用onArticleSelected()方法与activity共享事件。

public static class FragmentA extends ListFragment {
OnArticleSelectedListener mListener;
...
@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);
}
...
}

处理Fragment的生命周期

三种停留状态

  管理fragment的生命周期和管理activity的生命周期类似,和activity一样。fragment能够在三种状态下停留:

  Resumed

  fragment在running的activity中可见。

  Paused

  还有一个activity在前景执行,而且享有焦点,可是这个fragment所在的activity仍然可见(前景activity部分遮挡或者是半透明的)。

  Stopped

  fragment不可见。

可能是由于宿主activity处于stopped状态。或者fragment被remove掉,然后加在了back stack中。

  一个处于stopped状态的activity还是存活状态的,全部的状态和成员信息会被系统保持。可是。它不再被用户可见。而且假设宿主activity被kill掉,它也会被kill掉。

数据存储和恢复

  和Activity类似,能够用Bundle类对象保存fragment的状态。当activity的进程被kill之后,须要重建activity时,能够用于恢复fragment的状态。

  存储时利用onSaveInstanceState()回调函数,恢复时是在 onCreate()onCreateView(),
或者onActivityCreated()里。

Back Stack

  activity和fragment生命周期最重要的不同之处是它们怎样存储在各自的back stack中。

  Activity停止时,是存在一个由系统维护的back stack中。可是当fragment停止(被remove)时。须要程序猿显示地调用addToBackStack() ,而且fragment是存在一个由宿主activity掌管的back
stack中。

Fragment和Activity的生命周期

  宿主activity的声明周期直接影响到fragment的生命周期,比方activity生命周期的回调函数调用时,全部在当中的fragment的同样的回调函数会同一时候被调用。

  Fragment另一些额外的生命周期回调函数:

onAttach()

  当fragment和activity被关联时调用。

onCreateView()

  当创建fragment的UI被初始化时调用。

onActivityCreated()

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

onDestroyView()

  当fragment的UI被移除的时候调用。

onDetach()

  当fragment和activity去关联时调用。

如图:

  从这个图上能够看出activity的状态决定了fragment可能接收到的回调函数

  比方说。当activity接收到它的onCreate()回调函数,那么这个activity中的fragment最多接收到了onActivityCreated()。

  当activity处于Resumed状态时,能够自由地加入和移除fragment,也即是说。仅仅有activity在Resumed状态时,fragment的状态能够独立改变。

  可是,当activity离开Resumed状态,fragment的生命周期被activity控制。

最新文章

  1. hgrjhgkjh
  2. 使用Debussy+ModelSim快速查看前仿真波形
  3. oracle系列--第二篇 oracle下载
  4. Collection_Compare
  5. Nginx安装及配置简介
  6. 查询mysql哪些表正在被锁状态
  7. Zend server最大化应用程序的性能、扩展性和可用性
  8. 多校 Robot Motion
  9. Python中的模块介绍和使用
  10. SVO环境搭建
  11. T-SQL实用查询之查询字段所属的数据库表
  12. 删除JS 对象属性(元素)
  13. Python3高级基础(2)
  14. Wix中注册c#开发的Activex控件
  15. Visual Studio 2017 以前的旧格式的 csproj Import 进来的 targets 文件有时不能正确计算属性(PropertyGroup)和集合(ItemGroup)
  16. ViewGroup onInterceptTouchEvent,ViewGroup onTouchEvent,View onTouchEvent执行顺序说明
  17. ES6-Function
  18. form表单传递对象数组
  19. Android-Sqlite-SQL操作增删改查
  20. OpenCV中Mat操作clone() 与copyto()的区别

热门文章

  1. CF832B Petya and Exam
  2. jQuery文档就绪
  3. html中保证中文能够正常显示
  4. SQL 循环插入10000条
  5. Singleton.java.ft not found 相关错误的解决办法
  6. Android_撕衣服小案例
  7. CSS——text-indent
  8. Python总结2
  9. matlab数值数据的表示方法,输出数据以及相关函数
  10. includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。