Android同个应用中多个Activity的交互

一.新建项目,添加两个Activity

给MainActivity添加一个Button和一个EditText事件,其中EditText创建需要自写代码:

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="428dp"
    android:text="点击传送"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<EditText
    android:id="@+id/editTextUserInput"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:autofillHints=""
    android:hint="Enter text"   //Edit显示文本信息
    android:inputType="text"   //Edit输入数据的类型
    tools:ignore="MissingConstraints,TextFields"   //创建EditText需要添加的属性
    tools:layout_editor_absoluteX="164dp"
    tools:layout_editor_absoluteY="356dp" />

EditText属性解释:

tools:ignore属性,是自定义EditText需要额外添加的,否则报错。

android:autofillHints用于Android的自动填充框架(Autofill Framework),根据该属性提供的值来预测用户可能想要填充的内容,并提供相应的建议。例如:

  • username:表示用户名字段
  • password:表示密码字段
  • emailAddress:表示电子邮件地址字段
  • name:表示用户的全名
  • phone:表示电话号码
  • postalAddress:表示邮政地址
  • postalCode:表示邮政编码
  • creditCardNumber:表示信用卡号码
  • creditCardSecurityCode:表示信用卡安全码(例如CVV)

提示值通常与 EditText 控件的 inputType 属性配合使用,以提供更好的用户体验。例如,如果 inputType 设置为 textPassword,则 autofillHints 应设置为 password。 此处设置为空是方便文本输入。

android:hint属性是EditText默认显示的文本信息。

android:inputType属性是EditText接受用户输出数据的类型,此处为text。


再给SecondActivity添加Textview事件:

<TextView
    android:id="@+id/textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="328dp"
    android:text=""
    app:layout_constraintHorizontal_bias="0.523"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

将android:text属性设置为空,用于显示第二个Activity从第一个Activity接收到的数据。

 二.MainActivity的方法设计

在MainActivity中设置Button的点击监听器,获取用户输入数据Edittext之后,利用Intent显示启动和putExtra()方法,传递用户数据给SecondACtivity。

package com.example.senddatatest;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.editTextUserInput);  // R.id.指向id为该值的控件
        Button button = findViewById(R.id.button);

        button.setOnClickListener(v -> {
            //获取用户输出数据
            String data = editText.getText().toString();

            //创建Intend,显示启动并通过putExtra方法传递数据
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            intent.putExtra("input_data", data);

            //启动第二个Activity
            startActivity(intent);
        });

    }
}

 三.SecondActivity获取用户数据

利用Intent的getStringExtra()方法获取字符串数据,并利用Textview显示化。

package com.example.senddatatest;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        //获取传入Intent
        Intent intent = getIntent();
        String data = intent.getStringExtra("input_data");

//        intent.getExtras();

        //显示接收到的数据
        TextView textView = findViewById(R.id.textview);
        textView.setText("Received data:" + data);
    }
}

四.setresult()、startActivityForResult()和onActivityResult()方法

1.setResult()

setResult() 是 Android Activity 类中的一个方法,用于返回结果给调用的 Activity。通常在使用 startActivityForResult() 启动一个新的 Activity 时,新的 Activity 可以在完成任务后使用 setResult() 方法将结果返回给启动原来的 Activity。 

方法签名

public final void setResult(int resultCode);

public final void setResult(int resultCode, @Nullable Intent data);

参数详解

(1)resultCode: 一个整型值,表示结果的状态。

通常使用的值有:

RESULT_OK: 操作成功,返回结果。

RESULT_CANCELED: 操作被取消,通常不返回结果。

RESULT_FIRST_USER 及以上:用户自定义的结果代码。

(2)data: 一个 Intent 对象,包含要返回的数据。这个参数是可选的,可以为 null。

2. startActivityForResult()

startActivityForResult(Intent intent, int requestCode)是一个在Android应用程序中用于启动另一个Activity并期望从那个Activity返回结果的方法。这个方法在Android 11(API 级别 30)之后被弃用,取而代之的是新的 Activity Result API (registerForActivityResult()和ActivityResultLauncher)。

方法签名

 void startActivityForResult(Intent intent, int requestCode)

参数详解

(1)Intent:这是一个 Intent 对象,它描述了要启动的 Activity。Intent 可以包含启动 Activity 所需的所有信息,包括目标组件、操作、数据、类别和额外的信息(extras)。

(2)Request Code:这是一个整型 int 标识符,用于区分来自不同 Activity 的结果。当你从启动的 Activity 返回结果时,这个代码会在onActivityResult()回调方法中返回,以便你可以确定是哪个 Activity 返回的结果,并据此做出相应的处理。

用法示例

假设有两个 Activity分别为MainActivity 和 SecondActivity。MainActivity 启动 SecondActivity 并期待从 SecondActivity 返回某些结果。

(1)在 MainActivity 中启动 SecondActivity:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);

startActivityForResult(intent, REQUEST_CODE);

(2)在 SecondActivity 中返回结果:

Intent returnIntent = new Intent();

returnIntent.putExtra("result_key", "Some Result");

setResult(Activity.RESULT_OK, returnIntent);

finish();

(3)在 MainActivity 中接收结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            String result = data.getStringExtra("result_key");
            // 处理返回的结果
        } else if (resultCode == Activity.RESULT_CANCELED) {
            // 处理取消的情况
        }
    }
}

注意事项

setResult() 通常在 finish() 方法之前调用,以确保在 Activity 结束之前设置结果。

resultCode 和 data 参数是可选的,可以根据实际需求选择是否传递。

尽量避免在 onActivityResult() 中执行耗时操作,如需执行网络请求或数据库操作,建议在后台线程中处理。

通过使用 setResult() 方法,可以方便地在多个 Activity 之间传递数据和状态,提升应用的交互性和用户体验。

3. onActivityResult()

onActivityResult() 方法中的 requestCode 是一个整数参数,用于标识启动的子 Activity 的请求代码。当你使用 startActivityForResult() 方法启动一个新的 Activity 时,需要传递一个请求代码(requestCode),以便在返回结果时能够区分哪个请求返回了结果

参数解释

(1)requestCode: 启动子 Activity 时传递的请求代码,用于区分不同的启动请求。你可以根据这个变量来判断是哪一个请求返回了结果。

(2)resultCode: 子 Activity 返回的结果代码,表示操作的结果状态,和startActivityForResult()方法中相似(RESULT_OK, RESULT_CANCELED 等)。

(3)data: 子 Activity 返回的结果数据,包含在一个 Intent 对象中。

用法示例

以下是一个完整的用法示例,包括如何启动子 Activity 和在 onActivityResult() 中处理返回的结果:

(1)在父 Activity 中启动子 Activity:

public static final int REQUEST_CODE_EXAMPLE = 1;   //标识为1的返回数据可以被接收

Intent intent = new Intent(ParentActivity.this, ChildActivity.class);
startActivityForResult(intent, REQUEST_CODE_EXAMPLE);

(2)在子 Activity 中返回结果:

Intent returnIntent = new Intent();
returnIntent.putExtra("result_key", "Some Result");
setResult(Activity.RESULT_OK, returnIntent);
finish();

(3)在父 Activity 中处理返回的结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // 检查是哪一个请求返回的结果
    if (requestCode == REQUEST_CODE_EXAMPLE) {
        // 检查结果代码
        if (resultCode == Activity.RESULT_OK) {
            // 获取返回的数据
            String result = data.getStringExtra("result_key");
            // 处理返回的数据
        } else if (resultCode == Activity.RESULT_CANCELED) {
            // 处理取消的情况
        }
    }
}

注意事项

唯一性: 确保每个请求代码requestCode在一个 Activity 中是唯一的,以便正确区分不同的请求。

匹配: 在 onActivityResult() 中,通过 requestCode 来匹配启动的请求,以正确处理对应的返回结果。

父子关系: 只有通过 startActivityForResult() 启动的子 Activity 才会触发 onActivityResult() 回调。

通过使用 requestCode,你可以在同一个父 Activity 中启动多个不同的子 Activity,并在 onActivityResult() 方法中准确地处理每个子 Activity 返回的结果。

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值