Activity组件(四):通过requestCode和resultCode来实现Activity间的数据回传
一、什么是数据回传
开发时,通过一个Activity来调用另一个Activity,当用户在第二个Activity中操作完成后,自动返回第一个Activity并将数据传给第一个Activity,从而使得第一个Activity可以获取第二个Activity的数据。
在第一个Activity界面中,通过startActivityForResult()来启动第二个Activity界面,在第二个界面中将数据通过setResult()回传,在第一个Activity中重写onActivityResult()方法。
requestCode:代表了启动Activity的请求码,用于标识请求来源,进而判断这个返回的数据的路径,从哪里开始,经过哪里,又回到这里。
resultCode:通过结果码在onActivityResult()方法进行判断,用来区分结果
二、实现充值的数据回传
点击按钮进入充值页面
直接点击确认充值,判断数据为空
输入充值金额
点击确认充值
再次点击按钮进入充值界面
点击取消充值
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.activityforresultdemo"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".PayActivity"/> </application> </manifest>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/recharge_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点击进行充值" /> <TextView android:id="@+id/pay_result" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="match_parent"/> </LinearLayout>
activity_pay.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:text="充值界面" android:textSize="30sp" android:layout_marginTop="40dp" android:layout_gravity="center" android:layout_height="wrap_content"/> <EditText android:id="@+id/pay_input_box" android:layout_width="match_parent" android:layout_marginTop="30dp" android:hint="请输入充值金额" android:inputType="number" android:maxLines="1" android:layout_height="wrap_content"/> <RelativeLayout android:layout_width="match_parent" android:layout_marginTop="20dp" android:layout_height="match_parent"> <Button android:id="@+id/start_pay_btn" android:layout_width="wrap_content" android:layout_marginLeft="40dp" android:text="确认充值" android:layout_height="wrap_content"/> <Button android:id="@+id/cancel_pay_btn" android:layout_width="wrap_content" android:layout_marginRight="40dp" android:layout_alignParentRight="true" android:text="取消充值" android:layout_height="wrap_content"/> </RelativeLayout> </LinearLayout>
MainActivity.java
package com.example.activityforresultdemo; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private Button mRechargeBtn; private TextView mPayResult; private static final int PAY_RESULT_CODE =1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initListener(); } private void initListener() { mRechargeBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //设置点击事件 Intent intent =new Intent(MainActivity.this,PayActivity.class); //使用startActivityForResult来替代原来的startActivity startActivityForResult(intent,PAY_RESULT_CODE); } }); } /** * 初始化控件 */ private void initView() { mRechargeBtn = (Button) this.findViewById(R.id.recharge_btn); mPayResult =(TextView) this.findViewById(R.id.pay_result); } /** * 返回的结果在这里回调 * @param requestCode * @param resultCode * @param data */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); String resultContent = null; //当我们判断这个请求码的时候,就知道,这是充值界面返回的结果 if (requestCode==PAY_RESULT_CODE) { if(resultCode==2){ //充值成功 resultContent=data.getStringExtra("resultContent"); }else if(resultCode==3){ //充值被取消 resultContent=data.getStringExtra("resultContent"); } mPayResult.setText(resultContent); } } }
PayActivity.java
package com.example.activityforresultdemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.annotation.Nullable; public class PayActivity extends Activity { private EditText mInoutBox; private Button mStartPayBtn; private Button mCancelPayBtn; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pay); initView(); initListener(); } private void initListener() { mStartPayBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handlerPay(); } }); mCancelPayBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handlerCancel(); } }); } private void handlerCancel() { Intent intent =new Intent(); intent.putExtra("resultContent","充值已被取消"); setResult( 3,intent); finish(); } private void handlerPay() { String paynumber=mInoutBox.getText().toString().trim(); if (TextUtils.isEmpty(paynumber)) { Toast.makeText(PayActivity.this,"未输入充值金额",Toast.LENGTH_SHORT).show(); return; } //充值成功 //setResult()有两个重载方法,一个只有resultCode,另一个还有intent Intent intent =new Intent(); intent.putExtra("resultContent","成功充值"+paynumber+"元"); setResult(2,intent); finish(); } private void initView() { mInoutBox=(EditText) this.findViewById(R.id.pay_input_box); mStartPayBtn=(Button) this.findViewById(R.id.start_pay_btn); mCancelPayBtn=(Button) this.findViewById(R.id.cancel_pay_btn); } }