您的位置:首页 > 其它

Fragment 方法

2015-06-12 13:05 253 查看
显示Fragment时(跟用户交互)要调用的核心的生命周期方法如下:
1. 把Fragment对象跟Activity关联时,调用onAttach(Activity)方法;
2. Fragment对象的初始创建时,调用onCreate(Bundle)方法;
3. onCreateView(LayoutInflater, ViewGroup, Bundle)方法用于创建和返回跟Fragment关联的View对象;
4. onActivityCreate(Bundle)方法会告诉Fragment对象,它所依附的Activity对象已经完成了Activity.onCreate()方法的执行;
5. onStart()方法会让Fragment对象显示给用户(在包含该Fragment对象的Activity被启动后);
6. onResume()会让Fragment对象跟用户交互(在包含该Fragment对象的Activity被启恢复后)。

Fragment对象不再使用时,要反向回调的方法:
1. 因为Fragment对象所依附的Activity对象被挂起,或者在Activity中正在执行一个修改Fragment对象的操作,而导致Fragment对象不再跟用户交互时,系统会调用Fragment对象的onPause()方法;
2. 因为Fragment对象所依附的Activity对象被终止,或者再Activity中正在执行一个修改Fragment对象的操作,而导致Fragment对象不再显示给用户时,系统会调用Fragment对象的onStop()方法。
3. onDestroyView()方法用于清除跟Fragment中的View对象关联的资源;
4. Fragment对象的状态被最终清理完成之后,要调用onDestroy()方法;
5. 在Fragment对象不再跟它依附的Activity关联的时候,onDetach()方法会立即被调用

下图是Fragment的生命周期与Activity的对应关系



从这个图上可以看出activity的状态决定了fragment可能接收到的回调函数
  比如说,当activity接收到它的onCreate()回调函数,那么这个activity中的fragment最多接收到了onActivityCreated()。

  当activity处于Resumed状态时,可以自由地添加和移除fragment,也即是说,只有activity在Resumed状态时,fragment的状态可以独立改变。

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

//通过FragmentManager找到另一个fragment中的edittext对象,并取得text内容 


            
button.setText(editText.getText().toString())


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);
}
...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: