12.在Activity页面之间传递数据

来源:互联网 发布:清洗过期淘宝二次审核 编辑:程序博客网 时间:2024/06/03 12:49

一.跳转数据(页面之间传值-startActivity+startActivityForResult)

<1>传递基本数据类型

        基本数据类型:
        整:byte short int long
        浮点:float double
        布尔:boolean
        字符:char

        引用: String

效果图如下:
 

具体代码实现:

layout

activity_main.xml(第一个页面)

<?xml version="1.0" encoding="utf-8"?><LinearLayout        xmlns:android="http://schemas.android.com/apk/res/android"        xmlns:app="http://schemas.android.com/apk/res-auto"        xmlns:tools="http://schemas.android.com/tools"        android:layout_width="match_parent"        android:layout_height="match_parent"        tools:context="com.zking.android12_activity.MainActivity"        android:orientation="vertical">        <EditText            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:hint="请输入用户名:"            android:id="@+id/et_main_uname"            /><!--输入框-->        <Button            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:text="写心情"            android:onClick="writeThink"            /><!-- 一点这个按钮就跳到写心情那个页面-->        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:id="@+id/tv_main_showThink"            /><!--展示写的心情的内容--></LinearLayout>

activity_think.xml(第二个页面)

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"        xmlns:app="http://schemas.android.com/apk/res-auto"        xmlns:tools="http://schemas.android.com/tools"        android:layout_width="match_parent"        android:layout_height="match_parent"        tools:context="com.zking.android12_activity.ThinkActivity"        android:orientation="vertical"><!--指定一个排列方式-->        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:id="@+id/tv_think_showName"            /><!--文本框:用于展示用户名-->        <EditText            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:lines="5"            android:hint="请写心情"            android:gravity="top"            android:id="@+id/et_think_content"            /><!--输入框:用于写心情-->            <!--lines="5":输入框默认5行-->            <!-- hint:提示文字-->            <!--gravity="top":提示文字在最上面-->        <Button            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:text="确定"            android:onClick="ok"            /></LinearLayout>

Java

第一种方式

MainActivity.java

package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;public class MainActivity extends AppCompatActivity {        private EditText et_main_uname;        private TextView tv_main_showThink;        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_main);                //拿到控件                et_main_uname = (EditText) findViewById(R.id.et_main_uname);//拿到写入的名字                tv_main_showThink = (TextView) findViewById(R.id.tv_main_showThink);                Log.i("test","onCreate");//查看控制台测试                String content=getIntent().getStringExtra("content");                tv_main_showThink.setText(content);        }        //点击按钮        public void writeThink(View view){//第一个页面写心情的按钮                String uname=et_main_uname.getText().toString();//拿到用户名                Intent intent=new Intent(this,ThinkActivity.class);//跳转到第二个页面                //传值                intent.putExtra("uname",uname);//根据名字拿值                startActivity(intent);        }}
ThinkActivity.java
package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.TextView;public class ThinkActivity extends AppCompatActivity {        private TextView tv_think_showName;        private EditText et_think_content;        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_think);                //做展示,拿到文本框                tv_think_showName = (TextView) findViewById(R.id.tv_think_showName);                //拿到第二个页面输入框中写的心情内容                et_think_content = (EditText) findViewById(R.id.et_think_content);                //获取第一个页面传递过来的数据                String uname=getIntent().getStringExtra("uname");                tv_think_showName.setText("你好:"+uname);        }        //点击按钮会         public void ok(View view){//第二个页面的ok按钮                 String content=et_think_content.getText().toString();//拿到写的心情的内容                 Intent intent=new Intent(this,MainActivity.class);//跳转到第一个页面                 intent.putExtra("content",content);                 startActivity(intent);         }}
第二种方式

MainActivity.java

package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;public class MainActivity extends AppCompatActivity {        private EditText et_main_uname;        private TextView tv_main_showThink;        //第二种方式:干掉了自己,第一个页面onCreate不调了        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_main);                //拿到控件                et_main_uname = (EditText) findViewById(R.id.et_main_uname);//拿到写入的名字                tv_main_showThink = (TextView) findViewById(R.id.tv_main_showThink);                Log.i("test","onCreate");//查看控制台测试        }        //点击按钮        public void writeThink(View view){//第一个页面写心情的按钮                String uname=et_main_uname.getText().toString();//拿到用户名                Intent intent=new Intent(this,ThinkActivity.class);//跳转到第二个页面                //传值                intent.putExtra("uname",uname);//根据名字拿值               //startActivity(intent);//很普通的跳  A页面跳B页面                //带有目的的跳(A页面跳B页面,还要跳回来)                startActivityForResult(intent,0x201);//请求码        }        //获取其他页面设置过来的结果        @Override        protected void onActivityResult(int requestCode, int resultCode, Intent data) {                super.onActivityResult(requestCode, resultCode, data);                Log.i("test","onActivityResult");//查看方法是否调了                String content=data.getStringExtra("content");//拿到值                tv_main_showThink.setText(content);        }}
ThinkActivity.java

package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.TextView;public class ThinkActivity extends AppCompatActivity {        private TextView tv_think_showName;        private EditText et_think_content;        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_think);                //做展示,拿到文本框                tv_think_showName = (TextView) findViewById(R.id.tv_think_showName);                //拿到第二个页面输入框中写的心情内容                et_think_content = (EditText) findViewById(R.id.et_think_content);                //获取第一个页面传递过来的数据                String uname=getIntent().getStringExtra("uname");                tv_think_showName.setText("你好:"+uname);        }        //第二种方式        //点击按钮(从第二个页面跳转到第一个页面)         public void ok(View view){//第二个页面的ok按钮                 String content=et_think_content.getText().toString();//拿到写的心情的内容                 Intent intent=new Intent();//不用指定了                 intent.putExtra("content",content);                 //设置结果                 setResult(0x100,intent);//16进制:0x   结果码                 //自杀(干掉自己,(第二个页面跳转之前)干掉当前的(之前打开的第一个)Activity)                 finish();                 //startActivity(intent);         }}


二.传递Bundle(数据包、集装箱)类型的数据

效果图:


实现代码如下:

Java

MainActivity.java

package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;public class MainActivity extends AppCompatActivity {        private EditText et_main_uname;        private TextView tv_main_showThink;        //第二种方式:干掉了自己,第一个页面onCreate不调了        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_main);                //拿到控件                et_main_uname = (EditText) findViewById(R.id.et_main_uname);//拿到写入的名字                tv_main_showThink = (TextView) findViewById(R.id.tv_main_showThink);                Log.i("test","onCreate");//查看控制台测试        }        //点击按钮[传递数据包Bundle  (集装箱)]  拿多个值        public void writeThink(View view){                String uname=et_main_uname.getText().toString();//拿到用户名                Intent intent=new Intent(this,ThinkActivity.class);//跳转到第二个页面                //传值(两组数据)                //方式一                //intent.putExtra("uname",uname);                //intent.putExtra("uage",19);                //方式二                //传递Bundle                Bundle bundle=new Bundle();                bundle.putString("uname",uname);                bundle.putInt("uage",19);                intent.putExtra("bundle",bundle);                startActivityForResult(intent,0x201);        }        //获取其他页面设置过来的结果        @Override        protected void onActivityResult(int requestCode, int resultCode, Intent data) {                super.onActivityResult(requestCode, resultCode, data);                Log.i("test","onActivityResult");//查看方法是否调了                String content=data.getStringExtra("content");//拿到值                tv_main_showThink.setText(content);        }}
ThinkActivity.java
package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.TextView;public class ThinkActivity extends AppCompatActivity {        private TextView tv_think_showName;        private EditText et_think_content;        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_think);                //做展示,拿到文本框                tv_think_showName = (TextView) findViewById(R.id.tv_think_showName);                //拿到第二个页面输入框中写的心情内容                et_think_content = (EditText) findViewById(R.id.et_think_content);                //获取第一个页面传递过来的数据                //String uname=getIntent().getStringExtra("uname");                //int uage=getIntent().getIntExtra("uage",0);                //获得 第二种方式                Bundle bundle=getIntent().getBundleExtra("bundle");                String uname=bundle.getString("uname");                int uage=bundle.getInt("uage");                tv_think_showName.setText("你好:"+uname+" "+uage);        }        //点击按钮(从第二个页面跳转到第一个页面)         public void ok(View view){//第二个页面的ok按钮                 String content=et_think_content.getText().toString();//拿到写的心情的内容                 Intent intent=new Intent();                 intent.putExtra("content",content);                 //设置结果                 setResult(0x100,intent);                 //自杀                 finish();         }}


三.传递对象时使用Serializable

创建实体类





效果图:


Java

Person.java

package com.zking.entity;import java.io.Serializable;/** * Created by Administrator on 2017/6/16 0016. */public class Person implements Serializable{        private int pid;        private String pname;        private int page;//右键+Generate        //构造-->Constructor        public Person() {        }        public Person(int pid, String pname, int page) {            this.pid = pid;            this.pname = pname;            this.page = page;        }        //封装-->Getter and Setter        public int getPid() {            return pid;        }        public void setPid(int pid) {            this.pid = pid;        }        public String getPname() {            return pname;        }        public void setPname(String pname) {            this.pname = pname;        }        public int getPage() {            return page;        }        public void setPage(int page) {            this.page = page;        }        //打印        @Override        public String toString() {            return "Person{" +                    "pid=" + pid +                    ", pname='" + pname + '\'' +                    ", page=" + page +                    '}';        }}
MainActivity.java
package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;import com.zking.entity.Person;public class MainActivity extends AppCompatActivity {        private EditText et_main_uname;        private TextView tv_main_showThink;        //第二种方式:干掉了自己,第一个页面onCreate不调了        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_main);                //拿到控件                et_main_uname = (EditText) findViewById(R.id.et_main_uname);//拿到写入的名字                tv_main_showThink = (TextView) findViewById(R.id.tv_main_showThink);                Log.i("test","onCreate");//查看控制台测试        }        //点击按钮[传递对象(对象集合)]        public void writeThink(View view){                String uname=et_main_uname.getText().toString();//拿到用户名                Intent intent=new Intent(this,ThinkActivity.class);//跳转到第二个页面                //传递对象                Person person=new Person(1,"admin",19);                intent.putExtra("person",person);                //带有目的的跳转                startActivityForResult(intent,0x201);        }        //获取其他页面设置过来的结果        @Override        protected void onActivityResult(int requestCode, int resultCode, Intent data) {                super.onActivityResult(requestCode, resultCode, data);                Log.i("test","onActivityResult");//查看方法是否调了                String content=data.getStringExtra("content");//拿到值                tv_main_showThink.setText(content);        }}
ThinkActivity.java
package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.TextView;import com.zking.entity.Person;public class ThinkActivity extends AppCompatActivity {        private TextView tv_think_showName;        private EditText et_think_content;        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_think);                //做展示,拿到文本框                tv_think_showName = (TextView) findViewById(R.id.tv_think_showName);                //拿到第二个页面输入框中写的心情内容                et_think_content = (EditText) findViewById(R.id.et_think_content);                //接收对象                Person person= (Person) getIntent().getSerializableExtra("person");                tv_think_showName.setTextSize(30);//看效果,字写大点                tv_think_showName.setText("你好:"+person.toString());        }        //点击按钮(从第二个页面跳转到第一个页面)         public void ok(View view){//第二个页面的ok按钮                 String content=et_think_content.getText().toString();//拿到写的心情的内容                 Intent intent=new Intent();                 intent.putExtra("content",content);                 //设置结果                 setResult(0x100,intent);                 //自杀                 finish();         }}


四.传递对象时使用Parcelable

注:布局文件和其他Activity同第三点的一样

Person.java

package com.zking.entity;import android.os.Parcel;import android.os.Parcelable;import java.io.Serializable;/** * Created by Administrator on 2017/6/16 0016. */public class Person implements Parcelable {//Alt+回车:实现两个方法        private int pid;        private String pname;        private int page;//右键+Generate        //构造-->Constructor        public Person() {        }        public Person(int pid, String pname, int page) {            this.pid = pid;            this.pname = pname;            this.page = page;        }        protected Person(Parcel in) {            pid = in.readInt();            pname = in.readString();            page = in.readInt();        }        public static final Creator<Person> CREATOR = new Creator<Person>() {            @Override            public Person createFromParcel(Parcel in) {//从序列化中把属性读出来                return new Person(in);            }            @Override            public Person[] newArray(int size) {                return new Person[size];            }        };       //封装-->Getter and Setter        public int getPid() {            return pid;        }        public void setPid(int pid) {            this.pid = pid;        }        public String getPname() {            return pname;        }        public void setPname(String pname) {            this.pname = pname;        }        public int getPage() {            return page;        }        public void setPage(int page) {            this.page = page;        }        //打印        @Override        public String toString() {            return "Person{" +                    "pid=" + pid +                    ", pname='" + pname + '\'' +                    ", page=" + page +                    '}';        }    @Override    public int describeContents() {        return 0;    }    //把实体类属性写到序列化中    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeInt(pid);        dest.writeString(pname);        dest.writeInt(page);    }}
ThinkActivity.java
package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.TextView;import com.zking.entity.Person;public class ThinkActivity extends AppCompatActivity {        private TextView tv_think_showName;        private EditText et_think_content;        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_think);                //做展示,拿到文本框                tv_think_showName = (TextView) findViewById(R.id.tv_think_showName);                //拿到第二个页面输入框中写的心情内容                et_think_content = (EditText) findViewById(R.id.et_think_content);                //接收对象                Person person=getIntent().getParcelableExtra("person");                tv_think_showName.setTextSize(30);//看效果,字写大点                tv_think_showName.setText("你好:"+person.toString());        }        //点击按钮(从第二个页面跳转到第一个页面)         public void ok(View view){//第二个页面的ok按钮                 String content=et_think_content.getText().toString();//拿到写的心情的内容                 Intent intent=new Intent();                 intent.putExtra("content",content);                 //设置结果                 setResult(0x100,intent);                 //自杀                 finish();         }}


五.传递对象集合

效果图:


Person.java

package com.zking.entity;import android.os.Parcel;import android.os.Parcelable;import java.io.Serializable;/** * Created by Administrator on 2017/6/16 0016. */public class Person implements Parcelable {//Alt+回车:实现两个方法        private int pid;        private String pname;        private int page;//右键+Generate        //构造-->Constructor        public Person() {        }        public Person(int pid, String pname, int page) {            this.pid = pid;            this.pname = pname;            this.page = page;        }        protected Person(Parcel in) {            pid = in.readInt();            pname = in.readString();            page = in.readInt();        }        public static final Creator<Person> CREATOR = new Creator<Person>() {            @Override            public Person createFromParcel(Parcel in) {//从序列化中把属性读出来                return new Person(in);            }            @Override            public Person[] newArray(int size) {                return new Person[size];            }        };       //封装-->Getter and Setter        public int getPid() {            return pid;        }        public void setPid(int pid) {            this.pid = pid;        }        public String getPname() {            return pname;        }        public void setPname(String pname) {            this.pname = pname;        }        public int getPage() {            return page;        }        public void setPage(int page) {            this.page = page;        }        //打印        @Override        public String toString() {            return "Person{" +                    "pid=" + pid +                    ", pname='" + pname + '\'' +                    ", page=" + page +                    '}';        }    @Override    public int describeContents() {        return 0;    }    //把实体类属性写到序列化中    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeInt(pid);        dest.writeString(pname);        dest.writeInt(page);    }}
MainActivity.java
package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;import com.zking.entity.Person;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {        private EditText et_main_uname;        private TextView tv_main_showThink;        //第二种方式:干掉了自己,第一个页面onCreate不调了        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_main);                //拿到控件                et_main_uname = (EditText) findViewById(R.id.et_main_uname);//拿到写入的名字                tv_main_showThink = (TextView) findViewById(R.id.tv_main_showThink);                Log.i("test","onCreate");//查看控制台测试        }        //点击按钮[传递对象(对象集合)]        public void writeThink(View view){                String uname=et_main_uname.getText().toString();//拿到用户名                Intent intent=new Intent(this,ThinkActivity.class);//跳转到第二个页面                //传递对象                Person person1=new Person(1,"苏苏",19);                Person person2=new Person(2,"萌萌",19);                Person person3=new Person(3,"淼淼",19);                ArrayList<Person> persons=new ArrayList<>();                persons.add(person1);                persons.add(person2);                persons.add(person3);                //传递对象集合                intent.putParcelableArrayListExtra("persons",persons);                //带有目的的跳转                startActivityForResult(intent,0x201);        }        //获取其他页面设置过来的结果        @Override        protected void onActivityResult(int requestCode, int resultCode, Intent data) {                super.onActivityResult(requestCode, resultCode, data);                Log.i("test","onActivityResult");//查看方法是否调了                String content=data.getStringExtra("content");//拿到值                tv_main_showThink.setText(content);        }}
ThinkActivity.java
package com.zking.android12_activity;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.TextView;import com.zking.entity.Person;import java.util.List;public class ThinkActivity extends AppCompatActivity {        private TextView tv_think_showName;        private EditText et_think_content;        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_think);                //做展示,拿到文本框                tv_think_showName = (TextView) findViewById(R.id.tv_think_showName);                //拿到第二个页面输入框中写的心情内容                et_think_content = (EditText) findViewById(R.id.et_think_content);                //接受对象集合                List<Person> persons=getIntent().getParcelableArrayListExtra("persons");                tv_think_showName.setTextSize(30);                for (Person person : persons) {                        tv_think_showName.setText(tv_think_showName.getText()+"\n"+person.toString());                }        }        //点击按钮(从第二个页面跳转到第一个页面)         public void ok(View view){//第二个页面的ok按钮                 String content=et_think_content.getText().toString();//拿到写的心情的内容                 Intent intent=new Intent();                 intent.putExtra("content",content);                 //设置结果                 setResult(0x100,intent);                 //自杀                 finish();         }}











原创粉丝点击