- Fragment可调用getActivity()方法获取它所在的Activity
- Activity可调用FragmentManager的FindFragmentById()或FindFragmentByTag()方法获取Fragment
- Activity——>Fragment:在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法传,Fragment用getArgument收;
- Fragment——>Activity:需要在Fragment中定义一个内部回调的接口,再让包含Fragment的Activity实现改回调接口。这样Fragment可调用改回调方法将数据传递给Activity
- Activity——>Fragment的实现:
- Activity 代码:
String text = editText.getText().toString();
bundle.putString("msg", text);
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.frame_ll, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit(); - Fragment代码:
String text = getArguments().get("msg") + "";
textView.setText(text); - 问题:
- 你如果没有打字就直接进入这个Fragment中,会显示空指针异常,原因:
- 因为你没有数据传过来,而这Fragment中又想接收这个数据,所以会报异常;
- 解决办法:
- if (!(getArguments()==null)){
String text = getArguments().get("msg") + "";
textView.setText(text);
} - 添加一个判断就好了,只有在getArguments不为空的时候才接收。就好了
- if (!(getArguments()==null)){
- Fragment already active,也就是Fragment已存在异常,
- 我查了很多资料,发现大部分是说用setter或者getter进行数据获取就可以了。后来,结合自己的知识,想出一个另类的解决办法;
- 原因:你在Activity中开始传数据的时候,会用到setArguments,他的内部方法是这样的:
public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
} - 然后我就在自己代码中加了一句话:
- if (fragment == null) {
fragment = new MyFragment();
} else {
fragmentTransaction.remove(fragment);
fragment = new MyFragment();
} - 在commit之前先进行判断,如果,已经存在了,那么就把他移除再新建,如果没有存在,就直接新建,这样就可以解决这个异常了;
- if (fragment == null) {
- 你如果没有打字就直接进入这个Fragment中,会显示空指针异常,原因:
- Activity 代码:
- Fragment向Activity传递数据:
- Fragment代码:
- public interface ResultMsg{
public void sendMsg(String text);
}
private ResultMsg resultMsg =new ResultMsg() {
@Override
public void sendMsg(String text) {
}
}; - @Override
public void onAttach(Activity context) {
getActivity();
resultMsg= (ResultMsg)context;
super.onAttach(context);
} - resultMsg.sendMsg(textView.getText() + "");
- public interface ResultMsg{
- Activity代码:
- 继承Fragment上面的回调接口,然后,实现接口方法;
- public void sendMsg(String text) {
editText.setText(text);
} - 数据就传送过来了。
- 解释:
- 首先你定义一个接口,然后在定义一个该接口的变量,接着在需要的时候,调用这个接口的变量,传进去要传递的数值。最后,完善Fragment的onAttach方法,
- 因为,Fragment的onAttach方法,已经废弃(还能使用,但是不被推荐,但是在V4包中,可以用Context)。
- Fragment代码:
Fragment与Activity之间的数据交互
最新推荐文章于 2024-07-27 17:08:10 发布