zoukankan      html  css  js  c++  java
  • Activity之间数据传递(一)(简单传递,数据包Bundle,传递对象)

    一,简单传递(简单的字符串)

    第一个activity通过putExtra()将字符串传入i

     1  protected void onCreate(Bundle savedInstanceState) {
     2         super.onCreate(savedInstanceState);
     3         setContentView(R.layout.activity_main);
     4         findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
     5             @Override
     6             public void onClick(View v) {
     7                 Intent i= new Intent(MainActivity.this,TheAty.class);
     8                 i.putExtra("date","Hello SWWWWWW");
     9                 startActivity(i);
    10 
    11             }
    12         });
    13     }

    第二个activity通过getIntent()获取之前put进来的数据,然后再set到UI界面中去

      
      private TextView tv;

    1
    protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.activity_the_aty); 4 5 Intent i =getIntent(); 6 7 tv=(TextView) findViewById(R.id.tv);

          //通过“date”关键字进行添加
    8 tv.setText(i.getStringExtra("date")); 9 }

    二,通过 包Bundle进行传递

    通过首先将数据传入Bundle包,然后将bundle包放入第二个activity

    然后再通过第二个activity获取这个包

     1  protected void onCreate(Bundle savedInstanceState) {
     2         super.onCreate(savedInstanceState);
     3         setContentView(R.layout.activity_main);
     4         findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
     5             @Override
     6             public void onClick(View v) {
     7                 Intent i= new Intent(MainActivity.this,TheAty.class);
     8                 Bundle b=new Bundle();
     9                 b.putString("name","SWWWWW");
    10                 b.putInt("age",21);
    11                 b.putString("depart","KuaiJi");
    12                 i.putExtras(b);
    13                 startActivity(i);
    14 
    15             }
    16         });
    17     }

    第二个activity获取包时:

    1
    private TextView tv;
     
    protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.activity_the_aty); 4 5 Intent i =getIntent(); 6 Bundle data=i.getExtras(); 7 tv=(TextView) findViewById(R.id.tv); 8 tv.setText(String.format("name=%s,age=%d,depart=%s",data.getString("name"),data.getInt("age"),data.getString("depart"))); 9 }

    个人觉得,最后一行format()中的那一段,类似于C语言中的printf~

    三,传递一个对象

    <一>Serializable接口

    首先创建一个类User.java

    构造方法User()、getter()和setter()需要创建

    Serializable操作简单,只需要一句即可。但是相对来说效率比较低

    后面我会介绍另一种方法:继承Parcelable接口

     1 public class User implements Serializable{
     2     private String name;
     3     private int age;
     4 
     5     public String getName() {
     6         return name;
     7     }
     8 
     9     public void setName(String name) {
    10         this.name = name;
    11     }
    12 
    13     public int getAge() {
    14         return age;
    15     }
    16 
    17     public void setAge(int age) {
    18         this.age = age;
    19     }
    20     public User(String name, int age){
    21         this.name=name;
    22         this.age=age;
    23     }
    24 }

    同样的,new的一个新的类压入到Intent i中去

    然后通过后面一个activity中getIntent()出来

    MainActivity动作:

     1 protected void onCreate(Bundle savedInstanceState) {
     2         super.onCreate(savedInstanceState);
     3         setContentView(R.layout.activity_main);
     4         findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
     5             @Override
     6             public void onClick(View v) {
     7                 Intent i= new Intent(MainActivity.this,TheAty.class);
     8               
     9                 i.putExtra("user",new User("SWWWW",21));
    10                 startActivity(i);
    11 
    12             }
    13         });
    14     }

    TheAty动作:

    private TextView tv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_the_aty);
    
            Intent i =getIntent();
    //        Bundle data=i.getExtras();
                tv=(TextView) findViewById(R.id.tv);
    //        //tv.setText(i.getStringExtra("date"));
    //        tv.setText(String.format("name=%s,age=%d,depart=%s",data.getString("name"),data.getInt("age"),data.getString("depart")));
    
            User user= (User) i.getSerializableExtra("user");
            tv.setText(String.format("User info(name=%s, age=%d)",user.getName(),user.getAge()));
    
        }

     <二>继承Parcelable接口

    同样的,先写一个User.java类

    这里比较麻烦的就是必须要重写两个函数:

    writeToParcel和describeContents    即代码的最后两个函数

    第一个不需要改变

    第二个则模拟了第一个方法中的读取方法,不过是我们程序猿手写。但是效率高。

    为了代码更优,还是建议大家使用这种方法。

     
    public class User implements Parcelable {
        private String name;
        private 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 User(String name, int age){
            this.name=name;
            this.age=age;
        }
        protected User(Parcel in) {
            name = in.readString();
            age = in.readInt();
        }
    
        public static final Creator<User> CREATOR = new Creator<User>() {
            @Override
            public User createFromParcel(Parcel in) {
                return new User(in.readString(),in.readInt());
            }
    
            @Override
            public User[] newArray(int size) {
                return new User[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(getName());
            dest.writeInt(getAge());
        }
    }

    最后还需要改动的一点是:

    User user= (User) i.getSerializableExtra("user");

    需要改为:
    User user=i.getParcelableExtra("user");


  • 相关阅读:
    ASP.NET AJAX入门系列(1):概述
    ASP.NET中常用的文件上传下载方法
    Asp.net中DataBinder.Eval用法的总结
    ASP.NET AJAX入门系列(6):UpdateProgress控件简单介绍
    ASP.NET AJAX入门系列(8):自定义异常处理
    Javascrip常用语句
    26个常用的方法优化 ASP.NET 的性能
    JavaScript倒计时组件
    jQuery.buildFragment源码分析
    jQuery.Callbacks源码解读
  • 原文地址:https://www.cnblogs.com/icyhusky/p/5964756.html
Copyright © 2011-2022 走看看