传递数据
- 新建 Activity
在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity。
此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用。
- 用Intent 发送数据
在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件。
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,Main2Activity.class);
i.putExtra("Thanks","Thank you for reading my blog.");
startActivity(i);
}
});
}
- 用 Intent 接收数据
接下来再之前创建的 Activity 中同样新建一个 Intent 进行接受即可。和发送试用的 putExtra 类似,接受也可以用 getStringExtra 。当然了,正对不同的数据类型可以用不同的方法。
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent i = getIntent();
tv = (TextView)findViewById(R.id.tv);
tv.setText(i.getStringExtra("Thanks"));
}
传递 Bundle 包
在两个 Activity 之间也可以用 Bundle 包来进行数据的传递,相比上一种方式,这一种可以包含更多的数据,你可以将其认为是一个集合,这也正符合“包”的概念。
新建 Bundle
Bundle 可以嵌套 Bundle
对 Intent 对象使用 putExtras 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,Main2Activity.class);
Bundle a = new Bundle();
a.putString("Thanks", "Thank you for reading my blog.");
Bundle b = new Bundle();
b.putString("Android","Google");
b.putString("Windows","Microsoft");
a.putBundle("bundle",b);
i.putExtras(a);
startActivity(i);
}
});
}
- 根据相应的 Key 值获取相应的Bundle数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent i = getIntent();
Bundle a2 = i.getExtras();
tv = (TextView)findViewById(R.id.tv);
tv.setText(String.format("%s Android属于%s,Windows属于%s",
a2.getString("Thanks"),
a2.getBundle("bundle").getString("Android"),
a2.getBundle("bundle").getString("Windows")));
}
传递自定义对象
Android 开发过程中自然少不了“类”了,那么这种数据又如何传输呢。
- 切记:一定要执行序列化,即加上“implements Serializable”
public class Source implements Serializable{
private int source;
private String ID;
public int getSource() {
return source;
}
public void setSource(int source) {
this.source = source;
}
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public Source(String ID, int source) {
this.source = source;
this.ID = ID;
}
}
相应有了前面的了解,大家都可以直接猜到如何使用了,那我就不再啰嗦了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,Main2Activity.class);
i.putExtra("source",new Source("Player",1000));
startActivity(i);
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent i = getIntent();
Source s = (Source) i.getSerializableExtra("source");
tv = (TextView) findViewById(R.id.tv);
tv.setText(String.format("ID是%s,得分是%d",
s.getID(), s.getSource()));
}
从Activity返回数据
用户需要与应用进行交互,应用需要将用户输入的数据进行返回,所以……
在主 Activity 中定义 Button 和 TextView,前者用于导航至次 Activity , 后者用于显示返回的数据。
在次 Activity 中定义 Button 和 EditText,前者用于确认并返回至主 Activity,后者用于用户输入。
在次 Activity 中:
同样用 Intent 传递数据
用 setResult 设置返回结果
最后用 finish
private Button button ;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
editText = (EditText)findViewById(R.id.editText);
button = (Button)findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent();
i.putExtra("info",editText.getText().toString());
setResult(0, i); // 0表示成功
finish();
}
});
}
在主 Activity 中:
- 用 startActivityForResult 进行导航,并请求结果
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.textView);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,Main2Activity.class);
startActivityForResult(i,0);
}
});
}
- 重载 onActivityResult 方法,并通过 data 参数获取数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
textView.setText(data.getStringExtra("info"));
}
好了,Activity 之间就是这么传递数据的……
我们用 startActivity 方法来启动一个新的被放到 activity 堆栈顶部的 Activity 。如果希望在一个 activity 结束时获得结果,就应该调用 startActivityForResult 方法,它的第二参数就是确认请求的请求码。而返回的结果也会通过 onActivityResult 来获取,如上代码所示,根据 Intent 获取数据。
零点半了……睡觉……
本文为重复文章,仅为测试。