当前位置: 移动技术网 > IT编程>移动开发>Android > Fragment跳转时传递参数及结果回传的方法(推荐)

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

潘郑学习法,八路军编制,450002邮编

今天总结一下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(三)——自定义对话框视图及参数传递》第三部分:参数传递;详细讲过,大家可以先看源码,如果源码不懂,可以参考下这篇文章,这里就不再赘述。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网