
今天总结一下Fragment间的参数传递及结果返回的方法。
效果图:
1、点击“加载第二个Fragment按钮”,加载出第二个Fragment,同时传递过去参数:“从Fragment1传来的参数”这几个String;
2、当用户点击第二个Fragment中的几个图片时,将点中的结果返回给第一个Fragment,将用户的选择在第一个Fragment显示出来
一、基本架构搭建
首先,我们要把整个架构搭起来,然后再进行参数传递和回传
(一)、基本XML构建:
根据上面的效果,大家很容易看到两个Fragment的布局:
1、Fragment1的布局:(fragment1.xml)
很简单,垂直布局,上面一个ImageVIEw来盛装返回过来的图片结果,下面一个button来用来点击加载第二个Fragment;
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:background="#ffffff" androID:orIEntation="vertical"> <ImageVIEw androID:ID="@+ID/img_result" androID:layout_wIDth="100dp" androID:layout_height="100dp" androID:scaleType="center"/> <button androID:ID="@+ID/load_fragment2_btn" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:text="加载第二个Fragment"/> </linearLayout>
2、Fragment2的布局:(fragment2.xml)
这个也是垂直布局,上面的一个TextVIEw用来盛装从Fragment1传过来的String参数,下面的几个ImageVIEw用来显示几个供用户选择的图片
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:background="#ffffff" androID:orIEntation="vertical"> <TextVIEw androID:ID="@+ID/textvIEw" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="This is fragment 2" androID:textcolor="#000000" androID:textSize="25sp" /> <ImageVIEw androID:ID="@+ID/img1" androID:layout_wIDth="100dip" androID:layout_height="100dp" androID:scaleType="center" androID:src="@drawable/animal1"/> <ImageVIEw androID:ID="@+ID/img2" androID:layout_wIDth="100dip" androID:layout_height="100dp" androID:scaleType="center" androID:src="@drawable/animal2"/> <ImageVIEw androID:ID="@+ID/img3" androID:layout_wIDth="100dip" androID:layout_height="100dp" androID:scaleType="center" androID:src="@drawable/animal3"/> <ImageVIEw androID:ID="@+ID/img4" androID:layout_wIDth="100dip" androID:layout_height="100dp" androID:scaleType="center" androID:src="@drawable/animal4"/> </linearLayout>
(二)对应的Fragment类
1、在MainActivity初始化时,将Fragment1显示出来:
MainActivity对应的XML文件:(main_activity.xml)
<relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:tools="http://schemas.androID.com/tools" androID:ID="@+ID/main_layout" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" tools:context=".MainActivity"> <TextVIEw androID:text="@string/hello_world" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" /> </relativeLayout>
对应的代码:
public class MainActivity extends Activity { @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); Fragment1 fragment1 = new Fragment1(); getFragmentManager().beginTransaction().replace(R.ID.main_layout,fragment1).commit(); } } 2、Fragment1:在用户点击时,将fragment2添加到当前页面显示出来;
public class Fragment1 extends Fragment { @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceState) { VIEw vIEw = inflater.inflate(R.layout.fragment1,container,false); button btn = (button)vIEw.findVIEwByID(R.ID.load_fragment2_btn); btn.setonClickListener(new VIEw.OnClickListener(){ @OverrIDe public voID onClick(final VIEw vIEw) { Fragment2 fragment2 = new Fragment2(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.add(R.ID.main_layout,fragment2); transaction.addToBackStack(null); transaction.commit(); } }); return vIEw; } } 3、Fragment2:至于目前的它还是很简单的,只要能显示出来 就好了,所以他的代码为:
public class Fragment2 extends Fragment implements VIEw.OnClickListener { @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater,Bundle savedInstanceState) { VIEw vIEw = inflater.inflate(R.layout.fragment2,false); return vIEw; } } 二、Fragment间参数传递
至于Fragment间参数为什么要用SetArguments来传递,我就不讲了,看这篇文章:《Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数》,我这里只说项目中如何使用:
在Fragment2中,新建一个函数:newInstance(String text)来接收传过来的参数:
新建一个Fragment2实例,然后将参数通过SetArguments设置到其中;
public static Fragment2 newInstance(String text) { Fragment2 fragment = new Fragment2(); Bundle args = new Bundle(); args.putString("param",text); fragment.setArguments(args); return fragment; } 然后在Fragment2的OnCreateVIEw的时候再从arguments中获取参数:
public VIEw onCreateVIEw(LayoutInflater inflater,false); if (getArguments() != null) { String mParam1 = getArguments().getString("param"); TextVIEw tv = (TextVIEw)vIEw.findVIEwByID(R.ID.textvIEw); tv.setText(mParam1); } return vIEw; } 在Fragment1中,在调起Fragmen2t时,通过调用newInstance函数来获取实例并传递参数:
public class Fragment1 extends Fragment { @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater,false); button btn = (button)vIEw.findVIEwByID(R.ID.load_fragment2_btn); btn.setonClickListener(new VIEw.OnClickListener(){ @OverrIDe public voID onClick(final VIEw vIEw) { Fragment2 fragment2 = Fragment2.newInstance("从Fragment1传来的参数"); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.add(R.ID.main_layout,fragment2); transaction.addToBackStack(null); transaction.commit(); } }); return vIEw; } } (三)、从Fragment2向Fragment1回传参数
这里只有利用回调,有关回调传递参数的问题,我在前一篇文章中:《详解Dialog(三)――自定义对话框视图及参数传递》第三部分:参数传递;详细讲过,大家可以先看源码,如果源码不懂,可以参考下这篇文章,这里就不再赘述。
总结以上是内存溢出为你收集整理的Fragment跳转时传递参数及结果回传的方法(推荐)全部内容,希望文章能够帮你解决Fragment跳转时传递参数及结果回传的方法(推荐)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)