首页 > 学院 > 开发设计 > 正文

Activity 和 Fragment 之间的数据传递

2019-11-09 16:07:46
字体:
来源:转载
供稿:网友

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转化为该接口,在需要调用的时候回调。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表