Android开发中经常会使用Fragment开发,Fragment和其他Activity的通信就会经常使用到,一般来说会有两种通信方法,下面详细介绍。
方法一
众所周知,Activity之间的通信使用Intent,而第一种方法就是直接调用Fragment的方法getActivity()
获得所托管Activity实例,就可以通过Activity的getIntent()
方法获得启动该Acitvity的Intent,进而该Fragment就可以获得Intent对象实例,可以得到Intent对象所携带的信息。
Intent intent = getActivity().getIntent();
String info = intent.getStringExtra("your info");
注意:
该intent实际就是获得Fragment托管Acitvity的intent对象
该代码是在Fragment中调用的
这一种方法逻辑简单,操作也非常方便,但是有一个很大的缺陷,就是Fragment和该Activity绑定了,Fragment要获取信息就只能获取该Activity的Intent,这样就破坏了Fragment存在的意义—-灵活性
下面介绍第二种方法
方法二
该方法的主要思想是由Activity来管理传过来的信息,分配给相应的Fragment。因此,Fragment就需要相应的配置一个Bundle对象来保存数据,并且该Bundle是和Fragment对应绑定的,Android在Fragment中提供了setArguments(Bundle args)
方法,用于将Bundle对象和Fragment绑定,但是,调用setArguments(Bundle args)
时需要注意,必须在创建Fragment之后,托管给Activity之前完成,因此,一般约定在Fragment中新建如下方法:
/**
* 该方法提供给Activity绑定Fragment时调用
* @param name 由Activity传入需要通信的数据,可以自己根据实际情况定义
* @return 返回该Fragment实例对象
*/
public static QueryFragment newInstance(String name) {
Bundle args = new Bundle();
QueryFragment fragment = new QueryFragment();
args.putString("name",name);//再此添加绑定的数据
fragment.setArguments(args);
return fragment;
}
在Activity中调用该方法
@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_grade);
name = getIntent().getStringExtra("name");//获取启动该Activity的Intent,其中保存了需要通信的数据
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.mygrade_activity);
if (fragment == null){
fragment = QueryFragment.newInstance(name);//调用newInstance方法,该方法保证了再托管Activity前绑定Bundle对象到Fragment,并且将需要通信的数据存取该Bundle对象中
fragmentManager.beginTransaction()
.add(R.id.mygrade_activity,fragment)
.commit();
}
}
最后,在Fragment中调用getArguments()
方法获得Bundle对象,代码如下:
Bundle bundle = getArguments();//获得Fragment的Bundle对象
String name = bundle.getString("name");//从Bundle中获得保存的数据
使用该方法通信时,信息流程如下:
发送方Fragment使用Intent(该Intent保存有需要通信的数据)启动Acitvity(该Activity托管接收方Fragment),Acitvity使用getIntent()
方法获得该Intent,取出该数据后调用接收方Fragment提供的newInstance(中间的参数根据需要自己设置)方法将数据传入接收方Fragment绑定的Bundle中,最后,接收方Fragment调用getArguments()
方法获得Bundle对象,取出其中数据。
第二种方法虽然相对于第一种方法复杂,但是能很好的实现Fragment与Activity的分离,足够灵活,推荐使用第二种方法。