Fragment之间的通信.md
嵌套关系,使用setArguments()
在Fragment B中新建一个函数:newInstance()接收传过来的参数。
1 | public static Fragment2 newInstance(String text) { |
在Fragment B的onCreateView中获取参数
1 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { |
在Fragment A中,调用Fragment B时,通过newInstance函数获取实例并传递参数
1 | public class Fragment1 extends Fragment { |
同Activity不同Container的Fragment交互
这种情况有三中方法解决:
方法一:直接在Activity中操作
直接在Activity中找到对应控件的实例,然后直接操控即可
方法二:直接在Fragment中操作
这里有两个问题:如何获取自己控件的引用?如何获取其他Fragment页控件的引用?
- 首先获取自己控件的引用
可以在onCreateView()中获取1
2
3
4
5
6public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment1, container, false);
listView = (ListView)rootView.findViewById(R.id.list);//获取自己视图里的控件引用,方法一
return rootView;
}
在onCreateView()中,还没有创建视图,所以在这里如果使用getView()方法将返回空
另一种方法是在onActivityCreated()中获取,其回调在onCreate()执行后再执行
- 获取其它Fragment页控件引用方法
获取Activity资源,须等Activity创建完成后,必须放在onActivityCreated()回调函数中。1
2
3
4
5
6public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mFragment2_tv = (TextView) getActivity().findViewById(R.id.fragment2_tv);//获取其它fragment中的控件引用的唯一方法!!!
}
总的实现示例如下:
1 | public void onActivityCreated(Bundle savedInstanceState) { |
方法三:在各自Fragment中操作
方法二在Fragment A中操作了Fragment B,违背模块分离思想,应通过Activity将其分离
在Activity中可以直接通过FragmentManager.findFragmentById()获取Fragment实例
示例:
在Fragment2设置TextView函数
1 | public class Fragment2 extends Fragment { |
在Fragment1 中定义处理方式:
定义接口与变量
1
2
3
4
5private titleSelectInterface mSelectInterface;
public interface titleSelectInterface{
public void onTitleSelect(String title);
}接口变量赋值
接口给Activity使用,在Activity中给接口变量赋值,在Fragment与Activity关联时,需要强转1
2
3
4
5
6
7
8
9
10public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mSelectInterface = (titleSelectInterface) activity;
} catch (Exception e) {
throw new ClassCastException(activity.toString() + "must implement
OnArticleSelectedListener");
}
}调用接口变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
listView = (ListView) getView().findViewById(R.id.list);//获取自己视图里的控件引用,方法二
ArrayAdapter arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, mStrings);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String str = mStrings[position];
mSelectInterface.onTitleSelect(str);
}
});
}
在Activity中实现接口
1 | public class MainActivity extends FragmentActivity implements Fragment1.titleSelectInterface { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LT的编程笔记!