Android五种传递参数的方法
Android五种数据传递方法汇总
2014-01-24 18:42:13| 分类:默认分类|举报|字号订阅
Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互
传递,我把常用的几种
方法都收集到了一起。它们各有利弊,有各自的应用场景。
我现在把它们集中到一个例子中展示,在例子中每一个按纽代表了一种实现方法。
1. 利用Intent对象携带简单数据
利用Intent的Extra部分来存储我们想要传递的数据,可以传送int, long, char
等一些基础类型,对复杂的对象就无能为力了。
1.1 设置参数
[java]
//传递些简单的参数
Intent intentSimple = new Intent();
intentSimple.setClass(MainActivity.this,SimpleActivity.class);
Bundle bundleSimple = new Bundle();
bundleSimple.putString("usr", "xcl");
bundleSimple.putString("pwd", "zj");
intentSimple.putExtras(bundleSimple);
startActivity(intentSimple);
1.2 接收参数
[java]
this.setTitle("简单的参数传递例子");
//接收参数
Bundle bunde = this.getIntent().getExtras();
String eml = bunde.getString("usr");
String pwd = bunde.getString("pwd");
2. 利用Intent对象携带如ArrayList之类复杂些的数据
这种原理是和上面一种是一样的,只是要注意下。在传参数前,要用新增加一个List将对象包起来。
2.1 设置参数
[java]
//传递复杂些的参数
Map
map1.put("key1", "value1");
map1.put("key2", "value2");
List
Intent intent = new Intent();
intent.setClass(MainActivity.this,ComplexActivity.class);
Bundle bundle = new Bundle();
//须定义一个list用于在budnle中传递需要传递的ArrayList
ArrayList bundlelist = new ArrayList();
bundlelist.add(list);
bundle.putParcelableArrayList("list",bundlelist);
intent.putExtras(bundle);
startActivity(intent);
2.1 接收参数
[java]
this.setTitle("复杂参数传递例子");
//接收参数
Bundle bundle = getIntent().getExtras();
ArrayList list = bundle.getParcelableArrayList("list");
//从List中将参数转回 List
List Object>>)list.get(0); String sResult = ""; for (Map { for (String k : m.keySet()) { sResult += "\r\n"+k + " : " + m.get(k); } } 3. 通过实现Serializable接口 3.1 设置参数 利用Java语言本身的特性,通过将数据序列化后,再将其传递出去。[java] //通过Serializable接口传参数的例子 HashMap map2.put("key1", "value1"); map2.put("key2", "value2"); Bundle bundleSerializable = new Bundle(); bundleSerializable.putSerializable("serializable", map2); Intent intentSerializable = new Intent(); intentSerializable.putExtras(bundleSerializable); intentSerializable.setClass(MainActivity.this, SerializableActivity.class); startActivity(intentSerializable); 3.2 接收参数 [java] this.setTitle("Serializable例子"); //接收参数 Bundle bundle = this.getIntent().getExtras(); //如果传 LinkedHashMap,则bundle.getSerializable转换时会报ClassCastException,不知道什么原因 //传HashMap倒没有问题。 HashMap = (HashMap String sResult = "map.size() ="+map.size(); Iterator iter = map.entrySet().iterator(); while(iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); Object key = entry.getKey(); Object value = entry.getValue(); sResult +="\r\n key----> "+(String)key; sResult +="\r\n value----> "+(String)value; } 4. 通过实现Parcelable接口 这个是通过实现Parcelable接口,把要传的数据打包在里面,然后在接收端自 己分解出来。这个是Android独有的,在其本身的源码中也用得很多, 效率要比Serializable相对要好。 4.1 首先要定义一个类,用于实现Parcelable接口 因为其本质也是序列化数据,所以这里要注意定义顺序要与解析顺序要一致噢。 public class XclParcelable implements Parcelable { //定义要被传输的数据 public int mInt; public String mStr; public HashMap //Describe the kinds of special objects contained in this Parcelable's marshalled representation. public int describeContents() { return 0; } //Flatten this object in to a Parcel. public void writeToParcel(Parcel out, int flags) { //等于将数据映射到Parcel中去 out.writeInt(mInt); out.writeString(mStr); out.writeMap(mMap); } //Interface that must be implemented and provided as a public CREATOR field //that generates instances of your Parcelable class from a Parcel. public static final Parcelable.Creator = new Parcelable.Creator public XclParcelable createFromParcel(Parcel in) { return new XclParcelable(in); } public XclParcelable[] newArray(int size) { return new XclParcelable[size]; }; private XclParcelable(Parcel in) { //将映射在Parcel对象中的数据还原回来 //警告,这里顺序一定要和writeToParcel中定义的顺序一致才行!!! mInt = in.readInt(); mStr = in.readString(); mMap = in.readHashMap(HashMap.class.getClassLoader()); } public XclParcelable() { // TODO Auto-generated constructor stub } } 4.2 设置参数 [java] //通过实现Parcelable接口传参的例子 Intent intentParcelable = new Intent(); XclParcelable xp = new XclParcelable(); xp.mInt = 1; xp.mStr = "字符串"; xp.mMap = new HashMap xp.mMap.put("key", "value"); intentParcelable.putExtra("Parcelable", xp); intentParcelable.setClass(MainActivity.this, ParcelableActivity.class); startActivity(intentParcelable); 4.3 接收参数 [java] this.setTitle("Parcelable例子"); //接收参数 Intent i = getIntent(); XclParcelable xp = i.getParcelableExtra("Parcelable"); TextView tv = (TextView)findViewById(https://www.360docs.net/doc/c012252986.html,); tv.setText( " mInt ="+xp.mInt +"\r\n mStr"+xp.mStr +"\r\n size()="+xp.mMap.size()); 5. 通过单例模式实现参数传递 单例模式的特点就是可以保证系统中一个类有且只有一个实例。这样很容易就能实现, 在A中设置参数,在B中直接访问了。这是几种方法中效率最高的。 5.1 定义一个单实例的类 [java] //单例模式 public class XclSingleton { //单例模式实例 private static XclSingleton instance = null; //synchronized 用于线程安全,防止多线程同时创建实例 public synchronized static XclSingleton getInstance(){ if(instance == null){ instance = new XclSingleton(); } return instance; } final HashMap public XclSingleton() mMap = new HashMap } public void put(String key,Object value){ mMap.put(key,value); } public Object get(String key) { return mMap.get(key); } } 5.2 设置参数 [java] //通过单例模式传参数的例子 XclSingleton.getInstance().put("key1", "value1"); XclSingleton.getInstance().put("key2", "value2"); Intent intentSingleton = new Intent(); intentSingleton.setClass(MainActivity.this, SingletonActivity.class); startActivity(intentSingleton); 5.3 接收参数 [java] this.setTitle("单例模式例子"); //接收参数 HashMap XclSingleton.getInstance().mMap; String sResult = "map.size() ="+map.size(); //遍历参数 Iterator iter = map.entrySet().iterator(); while(iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); Object key = entry.getKey(); Object value = entry.getValue(); sResult +="\r\n key----> "+(String)key; sResult +="\r\n value----> "+(String)value; } 引用在函数参数传递中的作用 传递参数有三种方法:1,传递对象本身。2,传递指向对象的指针。3,传递对象的引用。 (1)传值方式 ①传给被调用函数的是整型、长整型、浮点型或双精度型变量。被调用的函数得定义相应的变量为形参。 ②传给被调用函数的是结构变量。被调用函数得定义结构变量为形参。 ③传给被调用函数的是结构变量的成员。被调用函数得定义与该成员同类的变量为形参。 #include "stdio.h" ?#include #include "stdio.h" void swapint(); int a,b; void main() { a = 5, b = 10; swapint(); printf("%d\n%d\n",a,b); } void swapint() { int temp; temp=a; a=b; b=temp; } (2)传址方式 ①传给被调用函数的是变量的地址。被调用函数得定义指针变量为形参。 ②传给被调用函数的是数组的地址即数组名。被调用的函数得定义数组或指针变量为形参。 ③传给被调用函数的是函数的地址即函数名称。被调用函数得定义指向函 数的指针变量为形参。④传给被调用函数的是结构的地址。被调用函数得定义结构指针为形参。 #include "stdio.h" ?#include Android布局属性大全 布局: AbsoluteLayout(绝对布局): xmlns:android="https://www.360docs.net/doc/c012252986.html,/apk/res/android" style="@..." android:clipChildren="true|false" android:clipToPadding="true|false" android:layoutAnimation="@---" android:animationCache="true|false" android:persistentDrawingCache="none|animation|scrolling|all":持续高速缓存绘图 android:alwaysDrawnWithCache="true|false" android:andStatesFromChildre="true|false" android:descendantFocusability="beforeDescendants|afterDescendants|bl ocksDescendants":后裔可聚焦 android:id="@+id/absoluteLayout" android:tag="@---" android:android:scrollX="---" android:android:scrollY="---" android:background="@---" android:padding="----" android:paddingLeft="----" android:paddingTop="----" android:paddingRight="----" android:paddingBotton="---" android:focusable="true|false" android:focusableInTouchMode="true|false" android:visibility="visible|invisible|gone" android:fitsSystemWindows="true|false":适合系统窗口 android:scrollbars="none|horizontal|vertical" android:scrollbarStyle="insideOverlay(内覆盖)|insideInset(内插 图)|outsideOverlay(外覆盖)|outsideInset(外插图)" android:isScrollContainer="true|false":是一个滚动集合 android:fadeScrollbars="true|false":褪色的滚动条 android:scrollbarFadeDuration="---":卷轴淡出 android:scrollDefaultDelayBeforeFade="---":滚动前默认延迟 android:scrollbarSize="---" android:scrollbarThumbHorizontal="@----":拇指水平滚动条 android:scrollbarThumbVertical="@----":拇指垂直滚动条 android:scrollbarTrackVertical="@---":垂直滚动条轨道 android:scrollbarTrackHorizontal="@---":水平滚动条轨道 android:scrollbarAlwaysDrawHorizontalTrack="true|false":水平滚动条总是吸引轨道 C#中方法的参数有四种类型 1. 值参数(不加任何修饰符,是默认的类型) 2. 引用型参数(以ref 修饰符声明) 3. 输出参数(以out 修饰符声明) 4. 数组型参数(以params 修饰符声明) 1. 值传递: 值类型是方法默认的参数类型,采用的是值拷贝的方式。也就是说,如果使用的是值类型,则可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。 使用值类型的例子如:(下面的Swap()未能实现交换的功能,因为控制传递回调用方时不保留更改的值) using System; class Test { static void Swap(int x, int y) { int temp = x; x = y; y = temp; } static void Main() { int i = 1, j = 2; Swap(i, j); Console.WriteLine("i = {0}, j = {1}", i, j); } } /* * 输出结果为: i=1, j=2 * 未能实现Swap()计划的功能 */ 2. 引用传递(ref类型) ref关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。 2.1. 若要使用ref 参数,则方法定义和调用方法都必须显式使用ref关键字。 2.2. 传递到ref 参数的参数必须最先初始化。这与out 不同,out 的参数在传递之前不需要显式初始化。 2.3. 如果一个方法采用ref 或out 参数,而另一个方法不采用这两类参数,则可以进行重载。 相关实例如下: using System; class Test { static void Swap(ref int x, ref int y) { int temp = x; x = y; y = temp; } static void Main() { int i = 1, j = 2; Swap(ref i, ref j); Console.WriteLine("i = {0}, j = {1}", i, j); } } /* * 引用类型实现了Swap()计划的功能: * 输出为: * i = 2, j =1 */ 3. 输出类型(out类型) out 关键字会导致参数通过引用来传递。这与ref 关键字类似。 与ref 的不同之处: 3.1. ref 要求变量必须在传递之前进行初始化,out 参数传递的变量不需要在传递之前进行初始化。 3.2. 尽管作为out 参数传递的变量不需要在传递之前进行初始化,但需要在调用方法初始化以便在方法返回之前赋值。 示例如下: using System; class Test { static void Swap(out int x, out int y) { //在这里进行了i和j的初始化 函数参数传递的原理 参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,方法有按值传递参数,按地址传递参数和按数组传递参数。 形参:指出现在Sub 和Function过程形参表中的变量名、数组名,该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。形参可以是除定长字符串变量之外的合法变量名,也可以带括号的数组名。 实参:实参就是在调用Sub 和Function过程时,从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应。 等号、函数名称、括弧和参数,是函数的四个组成部分。 函数“=SUM(1,2,3)”,1、2和3就是SUM函数的参数,没有参数1、2、3,函数SUM 则无从求值。 函数“=VLOOKUP(2,A:C,3,)”,没有参数2、A:C和3,函数VLOOKUP如何在A:C 区域查找A列中是2那一行第3列的数值? 当然,也有不需要参数的函数,如“=PI()”、“=NOW()”、“TODAY()”等。 函数参数传递的原理C语言中参数的传递方式一般存在两种方式:一种是通过栈的形式传递,另一种是通过寄存器的方式传递的。这次,我们只是详细描述一下第一种参数传递方式,另外一种方式在这里不做详细介绍。 首先,我们看一下,下面一个简单的调用例程: int Add (int a,int b,int c) { return a+b+c; } Android 开发之旅:view的几种布局方式及实践 https://www.360docs.net/doc/c012252986.html,/1943397/363552 2010-06-06 14:14:00 标签:布局 View 实践移动开发 Android 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。 https://www.360docs.net/doc/c012252986.html,/1943397/363552 引言 通过前面两篇: 1.Android 开发之旅:又见Hello World! 2.Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理及布局文件可谓有了比较深刻的认识和理解,并且用“Hello World!”程序来实践证明了。在继续深入Android开发之旅之前,有必要解决前两篇中没有介绍的遗留问题:View的几种布局显示方法,以后就不会在针对布局方面做过多的介绍。View的布局显示方式有下面几种:线性布局(Linear Layout)、相对布局(Relative Layout)、表格布局(Table Layout)、网格视图(Grid View)、标签布局(Tab Layout)、列表视图(List View)、绝对布局(AbsoluteLayout)。本文虽然是介绍View的布局方式,但不仅仅是这样,其中涉及了很多小的知识点,绝对能给你带来Android大餐! 本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: 1.1、View布局概述 2.2、线性布局(Linear Layout) 1. 2.1、Tips:android:layout_weight="1" 3.3、相对布局(Relative Layout) 4.4、表格布局(Table Layout) 5.5、列表视图(List View) 1. 5.1、一个小的改进 2. 5.2、补充说明 6.6、网格视图(Grid View) 7.7 、绝对布局() 8.8、标签布局(Tab Layout) 1、view的布局显示概述 通过前面的学习我们知道:在一个Android应用程序中,用户界面通过View和ViewGroup对象构建。Android中有很多种View和ViewGroup,他们都继承自View类。View对象是Android平台上表示用户界面的基本单元。 View的布局显示方式直接影响用户界面,View的布局方式是指一组View元素如何布局,准确的说是一个ViewGroup中包含的一些View怎么样布局。ViewGroup类是布局(layout)和视图容器(View container)的基类,此类也定义了https://www.360docs.net/doc/c012252986.html,youtParams类,它作为布局参数的基类,此类告诉父视图其中的子视图想如何显示。例如,XML布局文件中名为layout_something的属性(参加上篇的4.2节)。我们要介绍的View的布局方式的类,都是直接或间接继承自ViewGroup类,如下图所示: 我们对Android应用程序运行原理及布局文件可谓有了比较深刻的认识和理解,并且用“Hello World!” 程序来实践证明了。在继续深入Android开发之旅之前,有必要解决前两篇中没有介绍的遗留问题:View 的几种布局显示方法,以后就不会在针对布局方面做过多的介绍。View的布局显示方式有下面几种: 线性布局(Linear Layout)、 相对布局(Relative Layout)、 表格布局(Table Layout)、 网格视图(Grid View)、 标签布局(Tab Layout)、 列表视图(List View)、 绝对布局(AbsoluteLayout)。本文虽然是介绍View的布局方式,但不仅仅是这样,其中涉及了很多小的知识点,绝对能给你带来Android大餐! 本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: ?1、View布局概述 ?2、线性布局(Linear Layout) o 2.1、Tips:android:layout_weight="1" ?3、相对布局(Relative Layout) ?4、表格布局(Table Layout) ?5、列表视图(List View) o 5.1、一个小的改进 o 5.2、补充说明 ?6、网格视图(Grid View) ?7 、绝对布局() ?8、标签布局(Tab Layout) 1、view的布局显示概述 通过前面的学习我们知道:在一个Android应用程序中,用户界面通过View和ViewGroup对象构建。A ndroid中有很多种View和ViewGroup,他们都继承自View类。View对象是Android平台上表示用户界面的基本单元。 View的布局显示方式直接影响用户界面,View的布局方式是指一组View元素如何布局,准确的说是一个ViewGroup中包含的一些View怎么样布局。ViewGroup类是布局(layout)和视图容器(View containe r)的基类,此类也定义了https://www.360docs.net/doc/c012252986.html,youtParams类,它作为布局参数的基类,此 类告诉父视图其中的子视图想如何显示。例如,XML布局文件中名为layout_so mething的属性(参加上篇的4.2节)。我们要介绍的View的布局方式的类,都是直接或间接继承自ViewGroup类,如下图所示: 在C++中,参数传递的方式是“实虚结合”。 ?按值传递(pass by value) ?地址传递(pass by pointer) ?引用传递(pass by reference) 按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把以求出的实参表达式的值一一存入到形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。这种传递是把实参表达式的值传送给对应的形参变量,故称这种传递方式为“按值传递”。 使用这种方式,调用函数本省不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。 [cpp]view plaincopy 1./* 2. pass By value 3.*/ 4.#include 如果在函数定义时将形参说明成指针,对这样的函数进行调用时就需要指定地址值形式的实参。这时的参数传递方式就是地址传递方式。 地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。 [cpp]view plaincopy 1.#include VB过程中使用的参数分为实参和形参,简单的讲,在过程定义中给定的参数是形参,而在过程调用语句中给定的参数是实参。当调用一个有参数的过程时,形参和实参逐一匹配传递,根据传递方式不同,可分为按值和按地址两种。对参数传递方式的正确判别是过程学习中的一个难点,也是等级考试中的一个考点。 一、按值与按地址方式的内涵 按值传递参数,实质上是将实参的值复制一份给形参,因此形参获得的是实参的副本,当过程执行中对形参进行改变,并不会影响实参本身;按地址传递参数,实质上是将实参变量的地址传递给形参,因此形参与实参将指向同一内存单元,当过程执行中形参发生改变时,对应实参也将跟着改变。 二、参数传递方式判别方法 判断参数传递方式,不能单纯的看过程定义中形参前的修饰限定词有无By Val。参数传递到底采用何种方式,不仅取决于过程定义,还取决于过程调用,即与对应实参的具体形式也有很大关系。因此,应该从以下三个方面综合考虑: 1.形参是否为数组或者控件 2.形参前是否有ByVal修饰 3.对应实参是否为表达式或者值 具体判别方法,请见如下判别流程图。 三、不同传递方式对参数类型的要求 若参数按地址传递,则VB要求实参的数据类型与形参的数据类型完全一致;若参数按值传递,则实参数据类型不要求与形参完全一致,但是必须能够由VB 默认转化。 四、解题应用 (一)以江苏省计算机等级考试2001年春季的一道考题为例: 在应用程序中用“Private Function Fun(X As Integer, Y As Single)”定义了函数Fun. 调用函数Fun的过程中的变量I,J均定义为Integer型,能正确引用函数Fun的是____ ①Fun(I,J) ②Call Fun(I,3.65) ③Fun(3.14,234) ④Fun(“245”, “231.5”) A.①③ B.②③④ C.①②③ D.①②③④ 分析: Android 布局详解【图文】 Android 布局是开发中非常重要的一个知识部分,它的布局分为以下几种: Linear Layout:线性布局 Relative Layout:相对布局 Table Layout:表格布局 FrameLayout AbsoluteLayout Grid View:网格布局 Tab Layout:选项卡布局 List View:列表布局 一、Linear Layout 简单来说,直着排,横着排都可以,还可以嵌套,此布局运用的非常多。下面直接上示例代码及截图: 接下来,看一下布局XML文件: 参数传递方式
Android布局属性大全
C#中方法的参数有四种类型
函数参数传递的原理
Android 开发之旅-view的几种布局方式及实践
Android七种布局解析
C++中函数调用时的三种参数传递方式
参数传递方式与解题应用(精)
Android_布局详解【图文】