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");



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM