android 中 多个Activity 的跳转 与传值
16lz
2021-01-23
最近在学习安卓,所以记录下自己学习的点滴。
我的理解就是每个activity就是类似iOS中的Controller. 在iOS中,我们控制器传值的方式也是各种各样。 下面就介绍下在安卓开发中, 控制器相互传值的几种情况。
<pre name="code" class="java"> //这个是acitvity 跳转 startActivity(new Intent(MainActivity.this,Bactivity.class));
1. 基本数据类型的Activity传输 与 接收
A 传输:
findViewById(R.id.toBactivityBtn).setOnClickListener(new View.OnClickListener() {
//我布局中的一个button,给其定义一个事件,点击这个事件,跳转到 B Activity. @Override public void onClick(View v) { Intent myIntent = new Intent(MainActivity.this,Bactivity.class);
<pre name="code" class="java"> //第一种 这个是activity之间传递参数 ,传递基本数据类型 myIntent.putExtra("data", "您传输的字符串");//这个是acitvity 跳转 startActivity(new Intent(MainActivity.this,Bactivity.class));
}
});B 接收
Intent t = getIntent(); String result = t.getStringExtra("data"); //注意这儿,如果是传的Int类型的,就用 getIntExtra; 类型需要想对应<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
2. 多种基本类型的一次性传输 与接收
A传输
<pre name="code" class="java">findViewById(R.id.toBactivityBtn).setOnClickListener(new View.OnClickListener() { //我布局中的一个button,给其定义一个事件,点击这个事件,跳转到 B Activity. @Override public void onClick(View v) { Intent myIntent = new Intent(MainActivity.this,Bactivity.class); Bundle myBoundle = new Bundle(); myBoundle.putString("name", "张三"); myBoundle.putInt("age", 18); myBoundle.putString("address", "湖南省张家界");<span></span><pre style="background-color: rgb(255, 255, 255); font-family: Menlo; font-size: 12pt;"><span style="color: rgb(128, 128, 128); "><em>//方式一 这种方式适合只传送一个Bundle </em></span>
myIntent.putExtras(myBoundle);
//方式二 这种方式适合传送多个bundle, 接收方根据这个辨别名来取值。
myIntent.putExtra("bundle辨别名",myBoundle);
//这个是acitvity 跳转 startActivity(new Intent(MainActivity.this,Bactivity.class)); } });B 接收
Bundle myBoundle = t.getExtras(); <span style="color:#ff0000;"> //对应上面的第一种方式,只有一个bundle的时候</span> Bundle myBoundle = t.getBundleExtra("boundle"); <span style="color:#ff0000;">//对应上面的第二种方式,有多个Bundle的时候。</span> String tt = String.format("name = %s age = %s address = %s",myBoundle.getString("name") , myBoundle.getInt("age") , myBoundle.getString("address") );
3. 自定义对象的 传输 与 接收
前提为 : 我有一个 user类,并实现了构造函数 ,代码如下
package com.example.zgr.myfourtest;/** * Created by zgr on 16/3/22. */public class User { private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public User(String name, int age) { this.name = name; this.age = age; }}
A 传输 (
myIntent.putExtra("user",new User("zhangsan ",18));这句话需要注意,一定要实现虚拟化方法, 一共有两种方式, 一种为
Serializable, 一种为 Parcelable,所以分为两种情况描述
)findViewById(R.id.toBactivityBtn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent myIntent = new Intent(MainActivity.this,Bactivity.class); //对象传递 myIntent.putExtra("user",new User("zhangsan ",18)); //Serializable方式 ,后面介绍如果是这种方式如何做?
<span></span>myIntent.putExtra("user",new UserTwo("zhangsan",18)); //Parcelable 方式,后面介绍如果是这种方式如何做?<pre name="code" class="java"><span></span> startActivity(new Intent(MainActivity.this,Bactivity.class));} }); B接收
Intent t = getIntent(); User user = (User) t.getSerializableExtra("user"); <span style="font-family: Arial, Helvetica, sans-serif;">//Serializable方式 </span> UserTwo user = (UserTwo) t.getParcelableExtra("user"); <span style="font-family: Arial, Helvetica, sans-serif;">//Parcelable 方式</span>
package com.example.zgr.myfourtest;import java.io.Serializable;/** * Created by zgr on 16/3/22. *///java中的序列化方式,实现方法,就是继承与Serializable // 速度比较慢,效率低,大部分的操作都是系统帮助实现的。 //优点实现简单。public class User implements Serializable { private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public User(String name, int age) { this.name = name; this.age = age; }}
package com.example.zgr.myfourtest;import android.os.Parcel;import android.os.Parcelable;/** * Created by zgr on 16/3/22. *///这个是android平台给我们提供的序列化方法 //效率高,速度块 //缺点: 实现起来复杂,需要自己重载一些方法,然后写出对应的序列化过程public class UserTwo implements Parcelable { public String name; public int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public UserTwo (String name ,int age){ this.name = name; this.age = age; }
</pre><pre name="code" class="java"> // 必须实现的方法 @Override public int describeContents() { return 0; }
//必须实现的方法 @Override public void writeToParcel(Parcel dest, int flags) {
<span></span>//把需要序列化的字段,进行写入,类似给系统进行字段注册 dest.writeString(getName()); dest.writeInt(getAge()); }//需要实现的方法 public static final Creator<UserTwo> CREATOR = new Creator<UserTwo>() { @Override public UserTwo createFromParcel(Parcel source) {
<span></span> //这里返回序列化的对象,字段与上面写入的字段相对应 return new UserTwo(source.readString(),source.readInt()); } @Override public UserTwo[] newArray(int size) { return new UserTwo[0]; } };}
4. A Activity 传值 给 B Activity后 ----》 B Activity 在返回传值 , 类似 iOS的代理 回调一样。
A 需要接收 B 回传需要作出的改变
TextView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myView = (TextView)findViewById(R.id.firstTextView); System.out.println("app create "); findViewById(R.id.toBactivityBtn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent myIntent = new Intent(MainActivity.this,Bactivity.class); myIntent.putExtra("user",new UserTwo("ZHANGSAN two",22)); startActivityForResult(myIntent, 0); //这儿要选择带返回值的activety } }); }//必须实现的方法。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == 1){ //这个码,需要与回传地,传入的参数要一致,打个比方,有正确的返回值,这个回调码就为1 ,错误,为2,这个都要定义好,这边方便判断。 String t = data.getStringExtra("result"); myView.setText(t); } }
B 回传给A 数据 需要作出的改变
myView = (TextView) findViewById(R.id.callBackTextView); //这个是B Activity中的一个TextView. Intent myInit = new Intent(); //新建一个Intent myInit.putExtra("result",myView.getText().toString()); //和 A 传值 给B 一样的做法 setResult(1, myInit); // 这个就是提交返回信息 , 第一个参数为 对应的码, 第二个参数,回调的结果data finish(); //这个就会自动返回到 A Activity.
总结:
1. 基本数据类型的Activity传输 与 接收
2. 多种基本类型的一次性传输 与接收
3. 自定义对象的 传输 与 接收
4. A Activity 传值 给 B Activity后 ----》 B Activity 在返回传值 , 类似 iOS的代理 回调一样。
更多相关文章
- C#/IOS/Android通用加密解密方法
- WebView的使用之Android与JS通过WebView互调方法
- Android数据存储方式:SharePreference、SQLite、ContentProvider
- Android APK文件在电脑上面运行方法
- 获取Android SDK 源代码并在Eclipse中关联查看的方法--转
- android中遍历arrayList的四种方法