一.新建项目,添加两个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 返回的结果。