两个Activity携带参数传送示例

Activity之间通过文本框输入,传送到另外一个页面,进行显示。

首页的点击事件

 public void onClick(View v) {
        if (v.getId() == R.id.btn_act_request) {
            Intent intent = new Intent();
            //设置跳转的活动类
            intent.setClass(this, ActResponseActivity.class);
            //存入字符串
            intent.putExtra("resuest_time", DateUtil.getNowTimeDetail());
            intent.putExtra("resuest_content",et_request.getText().toString());
            startActivityForResult(intent, 0);
        }
    }

跳转页面的点击事件

 public void onClick(View v) {
        if (v.getId() == R.id.btn_act_response) {
            Intent intent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putString("response_time", DateUtil.getNowTime());
            bundle.putString("response_content", et_response.getText().toString());
            intent.putExtras(bundle);       //打包包裹给意图
            setResult(Activity.RESULT_OK, intent);  //携带意图返回
            finish();   //关闭页面
        }
    }

首页接收返回参数方法

protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 接收返回数据
        if (data != null) {
            // 从意图中取出名叫response_time的字符串
            String response_time = data.getStringExtra("response_time");
            // 从意图中取出名叫response_content的字符串
            String response_content = data.getStringExtra("response_content");
            String desc = String.format("收到返回消息:\n应答时间为%s\n应答内容为%s",
                    response_time, response_content);
            // 把返回消息的详情显示在文本视图上
            tv_request.setText(desc);
        }
    }

 

Activity进阶篇 课程回顾 Activity的创建过程 Activity的生命周期 Activity的启动模式 Intent的两种使用方法 本讲内容 1、Activity数据传递方式 Intent不仅可以用来开启Activity,也可以在Activity之间传递数据。在数据传递时,可以使用putExtra()方 法将数据存储在Intent中。 方法一: 1 2 3 4 String data = "Hello Activity02"; Intent intent = new Intent(this,Activity02.class); intent.putExtra("extra_data",data); startActivity(intent); 将数据从Activity02中取出的方法: 1 2 Intent intent = getIntent(); String data = = intent.getStringExtra("extra_data"); 方法二: putExtra()不仅可以传递基本类型数据,还可以传递Bundle对象。 1 2 3 4 5 Bundle bundle = new Bundle(); bundle.putString("name", "Linda"); Intent intent = new Intent(this,Activity02.class); intent.putExtras(bundle); startActivity(intent); 将Bundle对象数据从Activity02中取出的方法: 1 2 3 Intent intent = getIntent(); Bundle bundle = intent.getExtras(); String stuName = bundle.getString("name"); 案例分析——用户注册 按照“视图-控制-模型”三个层次进行设计,过程如下: 1 2 3 4 5 创建主Activity(MainActivity)及其布局文件activity_main.xml,以及从 Activity(LoginSuccessActivity)及其布局文件activity_login_success.xml 在MainActivity的“登录”控件的点击事件处理机制中,将用户名和密码保存到新创建的Intent中,然 后将该Intent发送给LoginSuccessActivity public class MainActivity extends AppCompatActivity { EditText nameEditText; EditText passwordEditText; Button loginButton; 在LoginSuccessActivity接收传送过来的Intent,并将其数据显示在布局文件activity_login_success.xml 中。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*为“登录”按钮设置事件监听机制*/ loginButton = findViewById(R.id.login_button); loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /*获取EditText控件中的用户名和密码*/ nameEditText = findViewById(R.id.user_edit_text); passwordEditText = findViewById(R.id.password_edit_text); String name = nameEditText.getText().toString().trim(); String password = passwordEditText.getText().toString().trim(); /*若用户名为“liu”,且密码为“123456”,则提示用户“登录成功”*/ if ((name.equals("liu") && password.equals("123456"))) { passData(name, password); } else { Toast.makeText(MainActivity.this, "用户名或者密码错误!", Toast.LENGTH_SHORT).show(); } } }); } private void passData(String name, String password) { Intent intent = new Intent(MainActivity.this, LoginSuccessActivity.class); /*将MainActivity中的用户名和密码保存到intent当中*/ intent.putExtra("name", name); intent.putExtra("password", password); startActivity(intent); } } 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 public class LoginSuccessActivity extends AppCompatActivity { TextView mUserTextView; TextView mPasswordTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login_success); /*获取传送过来的Intent,并取出其中的数据*/ Intent intent = getIntent(); String name = intent.getStringExtra("name"); String password =intent.getStringExtra("password"); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2、Activity数据回传方法 在使用新浪微博APP时,能发现在微博发布页面进入图库选择图片后,会回到微博发布页面并带回了图 片选择页面的图片信息。这个功能的实现利用了Activity回传数据。实现过程分为以下三步: Activity01利用startActivityForResult()方法,将数据传送Activity02。该方法接收两个参数,第一个 参数Intent用于保存所传递的数据,第二个参数requestCode用于判断数据的来源。例如: Activity02利用setResult()方法,将数据回传给Activity01。该方法接收两个参数。第一个参数结果码 resultCode用于判定数据处理结果是否成功,一般使用0或1;第二个参数Intent用于携带要回传的数 据。示例如下: Activity01重写onActivityResult()方法,获取Activity02所返回的数据。该方法接收三个参数。第一个 参数请求码requestCode判断数据来源;第二个参数结果码resultCode用于判定数据处理结果是否成 功,一般使用0或1;第三个参数Intent用于携带要回传的数据。示例如下: /*获取当前布局文件中的文本控件,并赋值*/ mUserTextView =findViewById(R.id.tv_username); mPasswordTextView = findViewById(R.id.tv_password); mUserTextView.setText("用户名:"+name); mPasswordTextView.setText("密码:"+password); } } 16 17 18 19 20 21 22 Intent intent=new Intent(Activity01.this,Activity02.class); startActivityForResult(intent, 1); 1 2 Intent intent=new Intent(); intent.putExtra(“equipment”, itemInfo); //封装数据,itemInfo为对象数据 setResult(1, intent); //回传数据,resultCode设为1,表示数据处理成功 finish(); //销毁当前Activity 1 2 3 4 案例分析——游戏装备购买 通过案例装备选择来演示Activity回传数据。本案例实现了购买装备增加生命值的功能。 构建MainActivity及其布局activity_main.xml,ShopActivity及其布局activity_shop.xml,详情参见附件 素材。 新知识:ProgressBar控件的使用。对于本案例,需要在activity_main.xml中增加以下ProgressBar控 件代码。 新知识:TableLayout控件和TableRow控件的使用。对于本案例,activity_shop.xml的代码如下。 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data!=null&&requestCode==1 &&resultCode==1){ /*从回传过来的Intent中获取数据*/ ItemInfo info=(ItemInfo) data.getSerializableExtra("equipment"); ······ //其他处理 } } 1 2 3 4 5 6 7 8 9 <ProgressBar android:id="@+id/pb_attack" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/tv_attack" android:layout_marginTop="10dp" android:max="1000" /> 1 2 3 4 5 6 7 8 在MainActivity中,为“购买装备”按钮设置单击事件监听机制,当用户单击该按钮时,创建一个 Intent,并将请求码requestCode设为1,然后将该Intent传递给ShopActivity。 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" tools:context=".ShopActivity"> <!--在本界面中创建一个只有一行的表格--> <TableLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp"> <TableRow android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/tv_goods_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_weight="1" android:text="屠龙刀" android:textSize="20sp" /> <TextView android:id="@+id/tv_goods_function" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:text="攻击力100+" android:textSize="20sp" /> <Button android:id="@+id/bt_buy" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="20dp" android:layout_toRightOf="@id/tv_goods_function" android:text="购买" /> </TableRow> </TableLayout> </RelativeLayout> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAttackProgressBar= findViewById(R.id.pb_attack); mAttackProgressBar.setProgress(100); /*为“购买装备”按钮设置单击事件监听机制*/ mBuyButton = findViewById(R.id.bt_buy_weapon); mBuyButton.setOnClickListener(new View.OnClickListener() { 1 2 3 4 5 6 7 8 9 10 在ShopActivity中,为“购买”按钮设置单击事件监听机制,当用户单击该按钮时,创建一个Intent, 将攻击力的数值添加到该Intent中,并将结果码resultCode设为1,然后将该Intent回传给 MainActivity。 说明: 请求码requestCode和结果码resultCode均可以设置为任意整数,只要发生数据传递的两个Activity之 间约定好即可。 在MainActivity中,重写方法onActivityResult(),获取ShopActivity所返回的数据,更新进度条。 @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,ShopActivity.class); startActivityForResult(intent,1); } }); } 11 12 13 14 15 16 17 18 public class ShopActivity extends AppCompatActivity { Button mGoodsButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shop); mGoodsButton = findViewById(R.id.bt_buy); mGoodsButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.putExtra("aggressivity", "100"); setResult(1,intent); finish(); } }); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data!=null&&requestCode==1 &&resultCode==1){ /*获取回传Intent中所包含的攻击力数据,据此更新进度条*/ String attackString = data.getStringExtra("aggressivity").toString().trim(); int attackNum = Integer.parseInt(attackString); updateProgress(attackNum); //更新进度条 } } private void updateProgress(int attackNum) { int currentValue = mAttackProgressBar.getProgress(); if(currentValue<1000){ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 按照“视图-控制-模型”三个层次进行设计,新知识点归纳如下: 视图层中添加进度条; 利用属性layout_width和layout_weight,实现TableLayout控件中各个控件在水平方向上的显示比 例。 3、课外作业 1)针对上述案例“游戏装备购买”,在实现数据回传过程中,放弃使用startActivityForResult(),而是采用 registerForActivityResult()(具有更好的易用性和接口统一性)来实现对回传数据的监听和处理。 主调Activity中的代码如下: currentValue = currentValue + attackNum; mAttackProgressBar.setProgress(currentValue); }else{ Toast.makeText(MainActivity.this,"您的攻击力已经最 大!",Toast.LENGTH_SHORT).show(); } } 15 16 17 18 19 20 public class MainActivity extends AppCompatActivity { ProgressBar mAttackProgressBar; Button mBuyButton; /* *调用registerForActivityResult()方法来注册一个对Activity结果的监听。 * registerForActivityResult()方法接收两个参数,第一个参数是一种Contract类型, * 由于我们是希望从另外一个Activity中请求数据,因此这里使用了StartActivityForResult这种 Contract。 * 第二个参数是一个Lambda表达式,当有结果返回时则会回调到这里,然后我们在这里获取并处理数据 即可。 * */ private ActivityResultLauncher<Intent> intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode()==RESULT_OK) { /*获取回传Intent中所包含的攻击力数据,据此更新进度条*/ String attackString = result.getData().getStringExtra("aggressivity").toString().trim(); int attackNum = Integer.parseInt(attackString); updateProgress(attackNum); //更新进度条 } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAttackProgressBar = findViewById(R.id.pb_attack); mAttackProgressBar.setProgress(100); /*为“购买装备”按钮设置单击事件监听机制*/ mBuyButton = findViewById(R.id.bt_buy_weapon); mBuyButton.setOnClickListener(new View.OnClickListener() { @Override 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 public void onClick(View v) { Intent intent = new Intent(MainActivity.this, ShopActivity.class); intentActivityResultLauncher.launch(intent); } }); } /*更新进度条*/ private void updateProgress(int attackNum) { int currentValue = mAttackProgressBar.getProgress(); if (currentValue < 1000) { currentValue = currentValue + attackNum; mAttackProgressBar.setProgress(currentValue); } else { Toast.makeText(MainActivity.this, "您的攻击力已经最大!", Toast.LENGTH_SHORT).show(); } } } 2)程序调试 以“游戏装备购买”案例为样本,–利用以下工具和技巧进行调试,解决项目中存在的问题,使之正常运行 并得到正确结果: 利用Build菜单中的Clean Project命令,重新编译项目。 利用测试框架Junit创建测试类。 利用android.util.log类的静态方法输入日志信息,并在程序运行时通过LogCat控制台查看Log信息。 通过Toast组件显示各种变量值,以观察错误。 设置断点,启动调试器跟踪程序运行过
最新发布
10-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值