1.activity传递数据给fragment
①使用bundle传递数据
> MyFragment fragment = new MyFragment();
>Bundle bundle = new Bundle();
>bundle.putString("data", "Activity发送给MyFragment的数据");
>fragment.setArguments(bundle);
然后在Fragment中的onCreatView方法中,通过getArgments()方法,获取到bundle对象,然后通过getString的key值拿到我们传递过来的值。
②在Activity中定义一个字段、然后添加set和get方法,
代码如下、mTitle就是要传递的参数、如果是传递对象、可以把mTitle换成一个对象。
public class MyActivity{
private String mTitle;
public void setmTitle(string str){
this.mtitle =str;
public String getmTitle(){
return mTitle;
}
}
fragment调用方法、需要注意的是在设值的时候要进行强转一下。
((MyActivity)getActivity()).getmTitle();
③使用newInstance传递数据
static MyFragment newInstance(String s){
MyFragment myFragment = new MyFragment();
Bundle bundle = new Bundle();
bundle.putString("DATA",s);
myFragment.setArguments(bundle);
return myFragment;
}
//同样,在onCreatView中直接获取这个值
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.layout_fragment,container,false);
Bundle bundle = getArguments();
String data = bundle.getString("DATA");
tv = (TextView) view.findViewById(R.id.id_fm_tv);
if(data != null){
tv.setText(data);
}
return view;
}
在宿主activity中,创建Fragment
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out);
fragment1 = MyFragment.newInstance("这是第一个fragment");//这里只需要直接调用这个方法,就创建了一个fragment
fragment2 = MyFragment.newInstance("这是第二个fragment");
fragment3 = MyFragment.newInstance("这是第三个fragment");
2.fragment 传递数据给activity
两个类之间传值可以用get()/set()的方式。但是这样不灵活。最好的办法是用回调,或者观察者模式来实现。
Fragment和Activity是两个组件类,不能直接new来获取对象。所以用观察者模式比较合理。android系统里也大量使用这种方式来传值。
①回调
在fragment中定义一个内部回调接口,再让包含该fragment的activity实现该回调接口,这样fragment即可调用该回调方法将数据传给activity。
MyActivity extends 回调类,传递给fragment,fragment调用回调类方法,再由activity去实现回调类方法。
②观察者模式
见下节
3.fragment 之间获取数据
①通过共同的Activity传递
这种方法是在Activity里面添加一个字段、来临时保存要一些值。在Activity中定义一个字段、然后添加set和get方法、代码如下、mTitle就是要传递的参数、如果是传递对象、可以把mTitle换成一个对象即可.
代码同1.2
② 通过bundle传递
可以使用bundle进行参数传递、这样在两个Fragment跳转的时候就可以带上参数了、同样也可以传递一个复杂的对象。
ft.hide(getActivity().getSupportFragmentManager().findFragmentByTag(""));
DemoFragment demoFragment = new DemoFragment();
Bundle bundle = new Bundle();
bundle.putString("key", "这是方法二");
demoFragment.setArguments(bundle);
ft.add(R.id.fragmentRoot, demoFragment, SEARCHPROJECT);
ft.commit();
在另外一个Fragment获取参数的方式只需要一个语句、key是自己定义的一个标识、参数的形式只要bundle能传递都可以实现
String string = getArguments().getString("key");
引用一下Fragment与它的Activity之间进行数据交换的方式。
1.Fragment中通过getActivity()然后进行强制转化,调用Activity中的公有方法 ((XXXXActivity)getActivity()).fun();
2.Activity在切换Fragment的时候,通过setArguments向Fragment传递参数,Fragment通过getArguments();获得从activity中传递过来的值
3.Activity实现一个接口,Fragment在onAttach方法中,将该Activity转化为该接口,在需要调用的时候回调。