记录一些自己理解的fragment的知识点,有不对,麻烦请指出,我会改的。
1、 activity和fragemnt的交互数据,fragemnt数据传递给activity,一般是fragment定义接口,并在onAttach()中检查activity实现了没。要传递数据的时候,fragment调用接口,activity实现接口的方法,把fragment传递过来的数据拿出来使用;activity传递数据给fragment的时候,一般是findfragmentbyId或者直接用fragment的实例,及new出来的对象,调用fragment的方法。
2、 创建framgent要继承Fragment 类,有ui界面加载必须在oncreatView方法中加载xml。
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.example_fragment, container, false);
}
传入onCreateView()的container参数是你的fragmentlayout将被插入的父ViewGroup(来自activity的layout) savedInstanceState 参数是一个Bundle, 如果fragment是被恢复的,它提供关于fragment的之前的实例的数据,
inflate() 方法有3个参数:
- 想要加载的layout的resource ID.
- 加载的layout的父ViewGroup.
传入container是很重要的, 目的是为了让系统接受所要加载的layout的根view的layout参数,
由它将挂靠的父view指定. - 布尔值指示在加载期间, 展开的layout是否应当附着到ViewGroup (第二个参数).
3、 将fragment添加到activity中
FragmentManager fragmentManager =getFragmentManager();
FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();
ExampleFragment fragment = newExampleFragment();
fragmentTransaction.add(R.id.fragment_container,fragment);//可以replace替换已经加载的fagment。
fragmentTransaction.commit()
4、 可以使用addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener
5、 在调用commit()之前, 可能想调用addToBackStack(),将事务添加到一个fragment事务的backstack. 这个back stack由activity管理, 并允许用户通过按下 BACK按键返回到前一个fragment状态
// Create new fragment and transaction
Fragment newFragment =newExampleFragment();
FragmentTransaction transaction=getFragmentManager().beginTransaction();
// Replace whatever is inthefragment_container view with this fragment,
// and add the transaction to thebackstack
transaction.replace(R.id.fragment_container,newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
这样添加的的newFragment之后,按返回键,会回到之前的fragment。Backstack没有fragment的话,就会退出activity。
6、 如果添加多个fragment到同一个容器, 那么添加的顺序决定了它们在view hierarchy中显示的顺序.
7、 假如fragment想要添加或者使用actionbar,必须在fragment的oncreateView中增加setHasOptionsMenu(true) ;然后重写onCreateOptionsMenu或者onOptionsItemSelected。在onOptionsItemSelected中先执行activity的这个方法,activity没有响应改菜单的事件,才会被fragment接受。