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);
? ? }
?}
|