Android开发-数据回传

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

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值