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

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

(0)

相关推荐

  • Android中给fragment写入参数的轻量开发包FragmentArgs简介

    Android开发有时候会令人头痛.你不得不为诸如建立fragment这样简单的事情写很多代码.幸运的是java支持一个强大的工具:注释处理器(Annotation Processors). Fragment的问题是你不得不设置很多参数,从而让它正常运行.很多android开发新手通常这样写: 复制代码 代码如下: public class MyFragment extends Fragment { private int id; private String title; public sta

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

    今天总结一下Fragment间的参数传递及结果返回的方法. 效果图: 1.点击"加载第二个Fragment按钮",加载出第二个Fragment,同时传递过去参数:"从Fragment1传来的参数"这几个String: 2.当用户点击第二个Fragment中的几个图片时,将点中的结果返回给第一个Fragment,将用户的选择在第一个Fragment显示出来 一.基本架构搭建 首先,我们要把整个架构搭起来,然后再进行参数传递和回传 (一).基本XML构建: 根据上面的效

  • 微信小程序 navigator 跳转url传递参数

     微信小程序 navigator 跳转url传递参数 使用方法说明 (1)传值:在navigator的属性url后拼接?id(参数名字)=要传递的值 (如果多个参数用&分开 &name=value&--.) (2)取值:options 是包含url地址中参数的对象,可以直接 点 获取. 扩展 JS获取web页面地址栏中的参数. https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&am

  • jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】

    本文实例讲述了jQuery实现浏览器之间跳转并传递参数功能.分享给大家供大家参考,具体如下: one.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="https://cdn.bootcss.com/jquery/2.2.2/jquery.slim.js">&l

  • 解决PHP使用CURL发送GET请求时传递参数的问题

    最近在使用curl发送get请求的时候发现传递参数一直没有生效,也没有返回值,以为是自己哪里写错了,网上找东西时也没有人专门来说get请求传递参数的内容,所以,今天在这里记录一下,希望可以帮到一些人 get请求是最简单的请求,不过要注意自己的请求是http请求还是https的请求,因为https请求时要关闭SSL验证,不然验证通不过,没有办法请求到数据: GET请求的参数 get传递参数和正常请求url传递参数的方式一样 function get_info($card){ $url ="http

  • 浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where id in %s" cs.execute(sql, (img_ids, )) # 直接传递元组包裹列表即可 补充知识:Python将多行数据处理成SQL语句中where条件in(' ',' ',' ')的数据 在工作中有时需要查询上万行指定的数据,就会用到SQL语句中 select * from ta

  • vue-cli开发时,关于ajax跨域的解决方法(推荐)

    目的:使用vue-cli构建的项目,在开发时,想要访问后台接口获取数据,这时就会出现跨域问题. 在config/index.js中进行如下配置 [即在进行ajax请求时,地址中任何以/api开头的请求地址都被解析为目标地址,target就是你想要的后台接口地址] proxyTable: { '/api': { target: 'https://188.188.18.8', changeOrigin: true, pathRewrite: { '^/api': " } } } "` vu

  • java操作mongodb时,对象bean和DBObject相互转换的方法(推荐)

    如下所示: package com.iqbon.spider.util; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.Date; import org.apache.commons.beanutils.BeanUtils; import com.mongodb.BasicDBObject; import com.mongodb.DBObje

  • Angular中$state.go页面跳转并传递参数的方法

    遇到一个页面跳转的时候,在跳转后的页面获取跳转前页面的数据,我想到用一种是localstorage,一种用broadcast和on,然后老大说不用这么麻烦,既然都$state.go了直接带参数,这次就介绍一下$state.go页面跳转传递参数. 1.路由页面(注意这里要在路由上添加一个参数用于传递数据,不然在页面跳转的时候会filter) .state("home.workpiece",{ // 跳转前的页面 url:"/workpiece", views: { h

  • Vue路由传递参数与重定向的使用方法总结

    目录 前言 概念 1.vue路由传参 2.vue路由重定向 实际使用场景 路由传参 1.使用步骤 2.params传参 2-1.路由属性配置参数 3.query传参 4.url字符串拼接 5.接收路由参数的方法,分 ? 和 : 两种接收方式 6.路由传参的示例 路由重定向 1.路由重定向语法 2.实际示例 其他 拓展 最后 前言 前端开发过程中,作为前端开发者来说关于vue的使用并不陌生,vue相关常用的知识点也是非常重要的,不管是在实际开发中还是在求职面试中都很重要.在vue使用中,路由相关的

  • vue-router跳转时打开新页面的两种方法

    最近还是在痛苦的挣扎中 挣扎吧 记录一下在vue项目中如何实现跳转到一个新页面(一个比较简单又比较基础的问题了),有两个方法: 1.<vue-link>标签实现新窗口打开 官方文档中说 v-link 指令被 <router-link> 组件指令替代,且 <router-link> 不支持 target="_blank" 属性,如果需要打开一个新窗口必须要用<a>标签,但事实上vue2版本的 <router-link> 是支持

随机推荐