Android學習筆記(二)Activiy學習——界面傳值

Activity之間傳值方法

先創建A.B兩個Activiy,在A與B中分別創建一個按鈕button,同時分別創建文本框TextView


Intent傳值

在A activity中創建按鈕監聽

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        //創建一個Intent,能夠打開B Activiy
        Intent i = new Intent(MainActivity.this,Main2Activity.class);
        //傳入數據,參數一傳數據名 參數二傳數據
        i.putExtra("tag","hello world");
        startActivity(i);
    }
});
在B activity獲取到數據

private TextView txView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    Intent i = getIntent();

    txView = (TextView) findViewById(R.id.TxView);
    txView.setText(i.getStringExtra("data"));
}


Bundle數據包傳值

在A activity中創建按鈕監聽

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        Intent i = new Intent(MainActivity.this,Main2Activity.class);

        Bundle b = new Bundle();
        b.putInt("int",123);
        b.putString("string","hello world");
        //可以直接添加到B
        i.putExtras(b);
        //也可以傳遞Bundle
        i.putExtra("bundle",b);
        startActivity(i);

    }
});

在B activity獲取到數據

Intent i = getIntent();
Bundle data = i.getExtras();
txView = (TextView) findViewById(R.id.TxView);
//若沒有值,可以設置默認值
txView.setText( String.format("int = %d string = %s name = %s",data.getInt("int"),data.getString("string"),data.getString("name","default")));

//通過key查找bundle
Bundle data1 = i.getBundleExtra("bundle");


傳遞自定義類

//傳遞類時,兩種方法,Serializable和Parcelable
    //Serializable直接在初始化時傳遞就可以(速度慢,使用簡單)
    //Parcelable需要實現系統的兩個方法(速度快,比較支持,使用複雜)

創建class類User

public class User implements Serializable{

    private String name;
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = 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 activity中

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        Intent i = new Intent(MainActivity.this,Main2Activity.class);

        i.putExtra("user",new User("123",3));
        startActivity(i);

    }
});

在B activity中獲取

User user = (User)i.getSerializableExtra("123");
txView.setText(String.format("%s %d",user.getName(),user.getAge()));


使用Parcelable傳遞類時

public class User implements Parcelable{

    private String name;
    private int age;

    protected User(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        //保存數據
        dest.writeString(name);
        dest.writeInt(age);
    }

    @Override
    public int describeContents() {
        return 0;
    }
    //創建Creator
    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            //in.readBundle()使用bundle可以寫任意數據
            //修改返回值
            return new User(in.readString(),in.readInt());
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = 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;
    }
}

獲取來自B activity的返回值

在button監聽裏面添加

Intent i = new Intent(MainActivity.this,Main2Activity.class);

startActivityForResult(i,0);

重寫方法

//resultCode爲result的返回碼,data爲Intent返回的數據
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    data.getStringExtra("data");
}




















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章