Fragment跳转时传递参数及结果回传的方法

 更新时间:2017年1月22日 11:06  点击:1245
这篇文章介绍了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>

对应的代码:

publicclassMainActivityextendsActivity {
  @Override
  protectedvoidonCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Fragment1 fragment1 =newFragment1();
    getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment1).commit();
  }
}

2、Fragment1:在用户点击时,将fragment2添加到当前页面显示出来;

publicclassFragment1extendsFragment {
  @Override
  publicView 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(newView.OnClickListener(){
      @Override
      publicvoidonClick(finalView view) {
        Fragment2 fragment2 =newFragment2();
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.add(R.id.main_layout, fragment2);
        transaction.addToBackStack(null);
        transaction.commit();
      }
    });
    returnview;
  }
}

3、Fragment2:至于目前的它还是很简单的,只要能显示出来 就好了,所以他的代码为:

publicclassFragment2extendsFragmentimplementsView.OnClickListener {
  @Override
  publicView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment2, container,false);
    returnview;
  }
}

二、Fragment间参数传递

至于Fragment间参数为什么要用SetArguments来传递,我就不讲了,看这篇文章:《Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数》,我这里只说项目中如何使用:

在Fragment2中,新建一个函数:newInstance(String  text)来接收传过来的参数:

新建一个Fragment2实例,然后将参数通过SetArguments设置到其中;

publicstaticFragment2 newInstance(String text) {
  Fragment2 fragment =newFragment2();
  Bundle args =newBundle();
  args.putString("param", text);
  fragment.setArguments(args);
  returnfragment;
}

然后在Fragment2的OnCreateView的时候再从arguments中获取参数:

publicView 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);
  }
  returnview;
}

在Fragment1中,在调起Fragmen2t时,通过调用newInstance函数来获取实例并传递参数:

publicclassFragment1extendsFragment {
  @Override
  publicView 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(newView.OnClickListener(){
      @Override
      publicvoidonClick(finalView view) {
        Fragment2 fragment2 = Fragment2.newInstance("从Fragment1传来的参数");
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.add(R.id.main_layout, fragment2);
        transaction.addToBackStack(null);
        transaction.commit();
      }
    });
    returnview;
  }
}

(三)、从Fragment2向Fragment1回传参数

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

这篇文章介绍了正则表达式学习教程之回溯引用backreference详解,有兴趣的同学可以看看本文

本文实例讲述了正则表达式回溯引用backreference。分享给大家供大家参考,具体如下:

在所有例子中正则表达式匹配结果包含在源文本中的【和】之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明。所有java例子都在JDK1.6.0_13下测试通过。

一、问题引入

一个在HTML页面中匹配标题标签(H1—H6)的问题:

文本:

<body>
<h1>Welcome to my page</H1>
Content is divided into twosections:<br>
<h2>Introduction</h2>
Information about me.
<H2>Hobby</H2>
Information about my hobby.
<h2>This is invalid HTML</h3>
</body>

正则表达式:<[hH][1-6]>.*?</[hH][1-6]>

结果:

<body>
【<h1>Welcome to my page</H1>】
Content is divided into twosections:<br>
【<h2>Introduction</h2>】
Information about me.
【<H2>Hobby</H2>】
Information about my hobby.
【<h2>This is invalid HTML</h3>】
</body>

分析:模式<[hH][1-6]>匹配任何一级标题的开始标签,而且不区分大小写,在这个例子中它匹配到了<h1>、<h2>,</[hH][1-6]>匹配到了</h1>、</h2>、</h3>;这里使用了懒惰型元字符来匹配标签中的文本,否则会匹配到从第一个开始标签到最后一下结束标签之间的内容。但是从结果可以看出,有一个无效的标签也匹配上了,即<h2></h3>,它们根本不能配对。要解决这个问题,就需要使用到回溯引用(backreference)。

二、回溯引用匹配

回溯引用是指模式的后半部分引用在前半部分中定义的子表达式。至于子表达式的使用、划分和引用,在前面已经介绍过了。现在来解决前面的例子:

文本:

<body>
<h1>Welcome to my page</H1>
Content is divided into twosections:<br>
<h2>Introduction</h2>
Information about me.
<H2>Hobby</H2>
Information about my hobby.
<h2>This is invalid HTML</h3>
</body>

正则表达式:<[hH]([1-6])>.*?</[hH]\1>

结果:

<body>
【<h1>Welcome to my page</H1>】
Content is divided into twosections:<br>
【<h2>Introduction</h2>】
Information about me.
【<H2>Hobby</H2>】
Information about my hobby.
<h2>This is invalid HTML</h3>

分析:首先匹配开始标题标签的模式<[hH]([1-6])>,使用括号把[1-6]做为子表达式,而匹配结束标题标签模式为</[hH]\1>,其中\1表示引用第一个子表达式,即([1-6]),如果([1-6])匹配到的是1,那\1也匹配到1,如果匹配到2,那\1也匹配到2,所以最后一个无效的标题标签就不会被匹配到了。

随着网站的越来越普及,与Web相关的开发技术持续热门,从开始简单的html到复杂的web开发语言asp、asp.net、php、jsp等等,在此,我就借助SEO马龙博客的平台跟大家简单的介绍一下常见的12种网页编程语言

如今,随着网站的越来越普及,与Web相关的开发技术持续热门,从前端到后端,从标记语言到开发语言,各种技术交相辉映,沉沉浮浮,从开始简单的html到复杂的web开发语言asp、asp.net、php、jsp等等,在此,我就借助SEO马龙博客的平台跟大家简单的介绍一下常见的12种网页编程语言

1、PHP

PHP是一个嵌套的缩写名称,是英文“超级文本预处理语言”(PHP:Hypertext Preprocessor)的缩写。PHP是一种HTML内嵌式的语言,与微软的ASP颇有几分相似,都是一种在服务器端执行的“嵌入HTML文档的脚本语言”,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用。

PHP独特的语法混合了C、Java、Perl以及PHP自创新的语法。它可以比CGI或者Perl更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;与同样是嵌入HTML文档的脚本语言 相比,PHP在服务器端执行,成分利用了服务器的性能;PHP执行引擎还会将用户经常访问的PHP程序驻留在内存中,其他用户在一次访问这个程序时就不需要诚信编译程序了,只要直接执行内存中的代码就可以了,这也是PHP高效率的体现之一。

PHP具有非常强大的功能,所有的CGI或者 的功能PHP都能实现,而且支持几乎所有流行的数据库以及操作系统。

2、Java

Java是一个由Sun公司开发而成的新一代编程语言。是近年来很流行的一种网络编程语言,它由C语言发展而来,是完全面向对象的语言。在与网络的融合中,已显现出它的强大生命力和广阔的前景。

Java的语法简练,学习和掌握比较容易,使用它可在各式各样不同种机器、不同种操作平台的网络环境中开发软件。Java正在逐步成为Internet应用的主要开发语言。它彻底改变了应用软件的开发模式,带来了自PC机以来又一次技术革命,为迅速发展的信息世界增添了新的活力。

您在编程实践中是否常常碰到要为不同的系统平台重复编程(比如为Windows系统设计一套程序,UNIX系统设计一套程序)?Sun Microsystems公司的Java语言以其”一次编程,到处执行”的技术优势,广泛应用于Internet计算机环境下的编程应用,避免您针对不同的系统平台重复编程,减少您的企业的开发成本。

3、JSP

JSP(Java Server Pages,Java服务器页面)是在Sun Microsystems公司的倡导下,由许多公司共同参与建立的一种新的动态网页技术标准。它在动态网页的建设方面具有强大而特殊的功能。Sun公司应用组建“Java社团”的思想开发JSP技术。

在开发JSP规范的过程中,Sun公司与许多主要的Web服务器、Web应用服务器和开发工具供应商,以及各种各样富有经验的开发团体进行合作,找到了一种适合于应用和页面开发人员的开发方法,它具有极佳的可移植性和易用性。针对JSP的产品,Sun公司授权予工具提供商(如Macromedia)、结盟公司(如Apache,Netscape)、最终用户、协作商及其他人。

最近,Sun公司将最新版本的JSP和Java Servlet(JSP 1.1,Java Servlet 2.2)的源代码发放给Apache,以求JSP和Apache紧密结合、共同发展。Apache,Sun公司和许多其他的公司及个人公开成立的咨询机构更能方便任何公司和个人免费取得信息。

4、ASP与ASP.NET

ASP是微软公司推出的意图取代CGI的新技术。通过它,用户可以使用几乎所有的开发工具来创建和运行交互式的动态网页,如返馈表单的信息收集处理、文件上传与下载、聊天室、论坛等等,实现了CGI程序的功能介是又比CGI简单,而且容易学习。

由于ASP使用基于开放设计环境的Active X技术,用户可以自己定义和制作组件加入其中,使自己的动态网页具有几乎无限的扩充能力。它还可利用ADO(Active Data ,微软的一种新的数据访问模型)方便地访问数据库,能很好地对数据进行处理。借WINDOWS 东风,ASP得到了长足的发展。

5、

脚本语言是介于HTML(HyperText Markup Language,超文本标示语言)和Java、C++和Visual Basic之类的编程语言之间的语言,它的语法和规则没有可编译的编程语言那样严格和复杂。

传统的HTML是静态的,为增强网页的动态功能,一些厂商先后推出了自己的 脚本语言,其中Netscape推出了 (for客户端和 for服务端两种),微软则推出了 和ASP两种,用于服务器端和客户端程序的编写。

6、

是一种基于对象( )和事件驱动(Event Driven)并具有安全性能的脚本语言。它与Java主要的不同点在于: 主要用于HTML的页面,脚本嵌入在HTML的源码中;而Java是一个独立的、完整的编程语言,既可以在Web中应用,也可以用于与Web网无关的情况。

另外,JavaS cript编写的程序不必在运行前编译,它们可以直接写入Web页面中并由调用它们的浏览器来解释执行。这样,一些基本交互作用就不用在服务器端完成,提高了客户端的响应时间,对于想了解其对象属性的博友,可以看下SEO马龙博客的《 对象属性的基础教程指南》相关介绍。

7、

为了适应Internet上的应用,Microsoft公司把用于应用程序描述的Visual Basic语言压缩成一个更合理的子集,称为Visual Basic ing Edition,简称 。它也是一种HTML嵌入脚本语言,具有易学易用等特点。

如果你已了解Visual Basic或Visual Basic for Applications,就会很快熟悉 。Microsoft公司将 语言作为实施其ActiveX脚本化的最佳选择,用户可以采用小的相互操作的部件一起来完成工作,使得应用程序的功能列加强大。

8、Perl

Perl是Practical Extraction and Report Language(实用摘录和报告语言)的缩写,由Larry Wall于1986年开发成功。当初的目的主要是Unix环境下从多个文本文件中产生报表,后来成为许多程序员工具箱中最受欢迎的工具,其发展速度和Unix内核的成长速度相仿。

现在Perl已经发展到5.0版本,并移植到了各种平台。

9、Python

是一种跨平台的开发语言,它可以运行在已知的各种操作系统之上,包括windows、Mac OS、Unix、BSD、Palm等。python是一种支持扩展的开发语言,主要的扩展变种有CPython、JPython、PerlPython。它们分别使用C、Java、Perl做它的扩展接口基础环境的。

更准确的说,Python也可以是一种跨语言的语言,对此我也曾在SEO马龙博客上发布一篇《Python语言代码的性能优化方法大全》,有兴趣的朋友可以看下。

10、ColdFusion

美国的一对兄弟allire,在为自己的客户解决数据库访问的问题时,感觉到了cgi程序在编写和维护上的难度是不能容忍的困难。于是,具有计算机天赋的Jeremy Allire便在1995年编写了一种快速响应且易于编写的动态脚本语言,叫做coldfusion,一经推出,便震撼整个网络行业。

之后,兄弟俩看到了coldfusion的发展前途,便成立了Allire公司(后来被macromedia收购)。之后的几年,全球500强中的一半都采用了coldfusion来解决公司不同情况的问题。通过不断的版本修改和开发者的不断壮大,Coldfusion后来发展成为业界知名的企业级解决方案的开发首选。

现在,为了产品线的统一,为了工业标准的统一,为了完全兼容Java平台,Macromedia发布了ColdfusionMX。而众位以前经常看到的Neo这个词则是macromedia对于使用新一代coldfusion开发行业解决方案的编码名称。

11、

即可扩展标记语言,可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。

它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

开发者源于SGML的设计和应用者,他们已经在SGML上投入了大量精力,但他们却发现SGML并没有完全发挥它的作用。在此,SEO马龙可以列举以下几个重要方面给大家,在这些方面SGML带来的影响可以说是一场革命。

SGML(通用标记语言标准ISO 8879:1986)是HTML的前身技术,它是文件和文件中信息的构成主体;SGML与HTML不同,它允许用户扩展tag集合,允许用户建立一定的规则,SGML所产生的tag集合是用来描叙信息段特征的,而HTML仅仅只是一个tag集合,所以我们可以说HTML是一个SGML的子集。

早在Seattle会议之前,Bosak和一些精心挑选的SGML结构信息专家就已向W3C提出了“网络上的SGML”计划,W3C支持并赞助了他们的努力,工作于1996年7月正式开始起动,工作的早期有较大的阻力,因为也存在反对SGML的人,一些制定 标准的W3C代表甚至声称“网络上的SGML”是不可能实现,工作组(原称“SGML编辑审议委员会”)并未退缩,他们打算让SGML以全新的面目出现在网上,给SGML以全新的面貌,故给它命名为“可扩展标识语言”,即 。

12、CGI

CGI(common Gateway Interface,公共网关接口)严格意义上来说并不算一种网页编程语言。CGI是信息服务器主机对外信息服务的标准接口,为了向客户端提供动态信息而制定。通过专门编写CGI脚本程序(在CGI控制下运行得程序,通常称为CGI程序),不仅可以生成静态的内容,而且可以生成完全无法预见的动态的内容!比如雅虎、搜狐等搜索引擎提供的强大搜索功能便是利用CGI实现的。

CGI脚本程序可以用C、C++等语言在多种平台上进行开发。无需太大修改就可以从一个平台移植到另一个平台上运行,具有很好的兼容性。

SEO马龙博客点评:

一般来说,对于一个客户来说,语言的选择并不是很重要,实现预期的功能是最重要的,况且这几种编程语言都可以实现复杂的功能。但是,不同的编程语言的安全性、执行效率、成本是不一样的,通俗来说,ASP最简单,但是安全性和执行效率很一般,PHP稍复杂,安全性和执行效率较高,而且PHP有着很多自身的优势,比如跨平台应用等。JSP则属于电子商务级别的,执行效率最高,但JAVA语言学习起来难度较大,开发周期也较长,服务器环境复杂,技术要求较高,对电子商务要求不高的中小企业不推荐采用该编程语言。

小编推荐的这篇文章介绍了两种Ajax打开新窗口被浏览器拦截的解决方法,有需要的同学可以参考一下

最近在做支付时发现打开支付窗口时被浏览器拦截了,百度了一下才发现是因为打开窗口前用ajax验证是否能支付,所以不是用户主动触发的打开ixin窗口,浏览器认为这样不安全,所以给拦截了。

解决办法一

先开始打开一个空的新窗口,然后改变新窗口的url,具体代码为

varwd = window.open();
$.ajax({
  type:"POST",
  dataType:"json",
  url: URL,
  data: {orderNo:orderNo},
  success:function(data) {
    if(data.status=='success'){
      wd.location.href ='http://www.baidu.com';
    }else{
      alert('订单不能支付!');
    }
  },error:function(data) {
    alert("正在加载请稍后!");
  }
});

这种实现方式有个弊端,就是不管ajax有没有成功,都会执行 var wd = window.open();这行代码,所以成功和失败都会打开一个新窗口,除非在失败后进行关闭,但这样用户体验会非常不好,所以我用的第二种方式去实现的。

解决办法二

因为ajax是默认是异步的,这样性能高,用户体验好,但这也导致了安全问题,要让浏览器认为弹出新窗口是安全的,必须让弹新窗口之前所有的ajax是同步的,具体代码为

$.ajax({
  type:"POST",
  dataType:"json",
  url: URL,
  async:false,//同步请求
  data: {orderNo:orderNo},
  success:function(data) {
     if(data.status=='success'){
       window.open("www.baidu.com");
     }else{
       alert('订单不能支付!');
     }
  },
  error:function(data) {
    alert("正在加载请稍后!");
  }
});
[!--infotagslink--]

相关文章