7.1、单向数据传递
Intent对象可以在组件之间转达信息,同时可以携带键值对的数据结构
在初始组件中创建Intent对象时,通过调用重载的putExtra函数即可实现数据的单向传递。
主组件:
//拿到跳转按钮
findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = ((EditText)findViewById(R.id.Etxt_msg)).getText().toString();
Intent it = new Intent(MainActivity.this, NextAct.class);
it.putExtra("msg",
//如果什么都不输入,则msg的值为null
msg
);
it.putExtra("names",12.5);
//intent对象可以接受多个键值对(extra 数据)
startActivity(it);
}
});
显示页面:
//如果在主界面没有任何输入,则这里取得的msgstr为null
String msgstr = getIntent().getStringExtra("msg");
Double doustr=getIntent().getDoubleExtra("msg",0.1);
//getDoubleExtra有两个参数(key,default)
//参数1:根据key取value的key值; 参数2:如果对应key取value失败,可以使用的默认值
if(msgstr.hashCode() == 0)//如果为null
msgstr = "null str";
((TextView)findViewById(R.id.txtv_showmsg)).setText("result:" + msgstr+" "+doustr);
7.2、Bundle
当我们在组件之间传递多个数据的时候,如果每传送一个数据就重载一次putExtra()函数,那么代码就会变得十分冗杂
我们引入Bundle包,将要传递的数据打包,直接将包传递
findViewById(R.id.btn_send_exerc).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bd=new Bundle();
bd.putString("msg","mosang");
bd.putDouble("doub",0.11);
bd.putInt("int",5);
Intent it=new Intent(MainActivity.this,NextAct.class);
it.putExtra("bundle",bd);
startActivity(it);
}
});
在接收端:
接受Bundle对象,通过对应的键值来获取数据
Bundle bd=getIntent().getBundleExtra("bundle");
String msgstr=bd.getString("msg");
double dou=bd.getDouble("doub");
int value=bd.getInt("value");
((TextView)findViewById(R.id.txtv_showmsg)).setText("result:" + msgstr+" "+dou+" "+value);
7.3、数据回传
在之前的传递中,我们都是从主组件向其他组件传递信息,这里我们要在主组件中获取其他组件传递回来的数据
主页面:
((Button)findViewById(R.id.btnchoose)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显式跳转到Image_act界面
Intent it = new Intent(MainActivity.this,Image_act.class);
//1.发起组件调用startActivityForResult()函数(Intent对象,请求码)
startActivityForResult(it,0x123);
}
});
图片选择界面:
//定义图片数组
public int[] imgs = new int[]
{
R.drawable.icon1,R.drawable.icon2,R.drawable.icon3,R.drawable.icon4,
R.drawable.icon5,R.drawable.icon6,R.drawable.icon7,R.drawable.icon8,
R.drawable.icon9,R.drawable.icon10
};
//在GridView上设置了一个监听器,重写了其点击事件
gd.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//2.在目的组件中,获取intent对象准备数据
Intent it = getIntent();
Bundle bd = new Bundle();
//资源id号
bd.putInt("imgid",imgs[position]);
it.putExtras(bd);
//通过setResult做标记并指定intent对象(k,v)
setResult(0x123,it);
//参数1.需要匹配的值需要与主界面设置的请求码相匹配才能回传,参数2.提供返回数据的对象
finish();
}
});
//源码:
public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
throw new RuntimeException("Stub!");
}
public interface OnItemClickListener {
void onItemClick(AdapterView<?> var1, View var2, int var3, long var4);
}
3.回到发起组件,重写回调函数
//当通过startActivityForResult函数启动其他的安卓组件
//该组件发生返回动作时,就会调用此函数
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
//判断是否匹配成功
//requestCoded的值与resultCode的值不需要相等,
//但requestCoded的值需要与函数参数的int requestCode值相等
//resultCode的值需要与函数参数的int resultCode值相等
if(requestCoded == 0x123 && resultCode的值需要与函数参数的 == 0x123)
{
//i取值
Bundle bd = intent.getExtras();
int imgid = bd.getInt("imgid");
ImageView img = (ImageView)findViewById(R.id.imgicon);
img.setImageResource(imgid);
}
}