Activity之间传递数据

Activity之间传递数据主要通过Intent。可以传递简单的值,多个复杂的值放在Bundle传递,还可以传递值对象。

下面我通过几个简单的例子演示一下。

一、传递简单的值

1.在activity_main.xml里面添加一个Button。目的是通过点击进入另一个Activity.

 <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnStartAty"
        android:text="启动另一个Activity"/>

2.在MainActivity.java里面写Button事件监听器的代码。通过Intent的putExtra()方法,把数据发送出去。

 findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,TheAty.class);
                i.putExtra("data","from MainActivity");
                startActivity(i);
            }
        });
3.新建一个Activity,给这个Activity的xml文件中添加一个TextView来显示数据,在java文件中写接收数据的代码,并设置到TextView上。

  private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_the_aty);
        tv = (TextView) findViewById(R.id.tv);
        Intent i =getIntent();
        tv.setText(i.getStringExtra("data"));
    }

二、Bundle传递值

1.在MainActivity.java中

 findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,TheAty.class);
                Bundle b = new Bundle();
                b.putString("name","William");
                b.putInt("age",20);
                i.putExtras(b);
                startActivity(i);
            }
        });
    2.在另一个Activity中接收

  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(String.format("name=%s,age=%d",data.getString("name"),data.getInt("age")));
    }

三、传递值对象

传递值对象有两种方法,一种是实现Serializable,一种是实现Parcelable,前一种比较简单,但是效率比较低,后一种需要实现一些方法,是专为Android设计,比较高效。

1)实现Serializable。

1.创建User对象,实现Serializable

public class User implements Serializable {
    private String name;
    private int age;

    User(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}
2.在MainActivity里传递出去

findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,TheAty.class);
                i.putExtra("user",  new User("tang",22));
                startActivity(i);
            }
        });

3.在目标Activity里接收

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_the_aty);
        Intent i =getIntent();
       User user = (User) i.getSerializableExtra("user");
        tv = (TextView) findViewById(R.id.tv);
        tv.setText(String.format("name=%s,age=%d",user.getName(),user.getAge()));
    }


        2)实现Parcelable

在Parcelable里面没有自动序列的机制,需要在writeToParcel()方法里手动的写。

1.在User类里实现Parcelable。

public class User implements Parcelable {
    private String name;
    private int age;

    User(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(getName());
        dest.writeInt(getAge());
    }
    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel source) {
            return new User(source.readString(),source.readInt());
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
}
2.在目标Activity接收
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_the_aty);
        Intent i =getIntent();
       User user = (User) i.getParcelableExtra("user");
        tv = (TextView) findViewById(R.id.tv);
        tv.setText(String.format("name=%s,age=%d",user.getName(),user.getAge()));
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值