上一篇博文讲的是直接在layout中的xml文件中声明fragment,用android:name=""指明了在layout中药实例化的fragment类,当系统创建这个activity layout时,它实例化每一个在layout中声明的fragment,并调用每一个对应fragment类的onCreateView()方法,来获取每一个fragment的layout,系统将从fragment类返回的VIew直接插入到fragment元素所在的地方。
第二种添加fragment的方法,使用FragmentManager将fragment添加到一个已存在的ViewGroup。只需要在指定一个放置fragment的ViewGroup,当activity运行的任何时候,都可以将fragment添加到activity layout。为了在activity中操作fragment的添加、删除、或替换一个fragment等,要用到FragmentTransaction。
这种情况下,要再操作fragmeng布局文件中的组件,就不可以在MainActivity中直接用findViewById方法提取了(只有在main.xml文件中直接声明的fragment可以用),不然会报空指针错误,你可能会想到用inflater,效果是一样的,就是在MainActivity中要拿到该布局文件的View。
官网有这样一个小实例:
https://developer.android.com/training/basics/fragments/communicating.html
要实现这样的交互,步骤如下:
首先在RightFragment类中定义一个接口和一个接口里面的方法:
public interface MyListener{
public void onViewItemClick(View v);
}
然后定义一个接口类的引用:MyListener listener;
在RightFragment的onAttach()方法中给listener这个引用赋个值,不然会出讨厌的nullpointerexception哦
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
listener = (MyListener)activity;
}
在MainActivity类中实现MyListener这个接口,实现里面的方法,这样在RightFragment类中直接用
listener.onViewItemClick(view);将该类的view传过去,在MainActivity的实现方法函数中用v.findViewById(),就可以拿到任何RightFragment布局中的组件。
实现效果:
附上源代码: