欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Fragment跳转时传递参数及结果回传的方法(推荐)

程序员文章站 2024-02-23 15:10:04
今天总结一下fragment间的参数传递及结果返回的方法。 效果图: 1、点击“加载第二个fragment按钮”,加载出第二个fragment,同时传递过去参数:“从f...

今天总结一下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, viewgroup container, bundle savedinstancestate) { 
 view view = inflater.inflate(r.layout.fragment2, container, 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, viewgroup container, bundle savedinstancestate) { 
 view view = inflater.inflate(r.layout.fragment2, container, 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, 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 = fragment2.newinstance("从fragment1传来的参数"); 
  fragmenttransaction transaction = getfragmentmanager().begintransaction(); 
  transaction.add(r.id.main_layout, fragment2); 
  transaction.addtobackstack(null); 
  transaction.commit(); 
  } 
 }); 
 return view; 
 } 
} 

(三)、从fragment2向fragment1回传参数

这里只有利用回调,有关回调传递参数的问题,我在前一篇文章中:《详解dialog(三)——自定义对话框视图及参数传递》第三部分:参数传递;详细讲过,大家可以先看源码,如果源码不懂,可以参考下这篇文章,这里就不再赘述。