在我的活动中,我通过startActivityForResult从主活动中调用第二个活动。在我的第二个活动中,有一些方法完成这个活动(可能没有结果),但是,只有其中一个返回结果。
例如,从主活动中调用第二个活动。在这个活动中,我正在检查手机的一些功能,比如它是否有摄像头。如果没有,我就关闭这个活动。此外,在MediaRecorder或MediaPlayer的准备过程中,如果发生问题,我将关闭此活动。
如果它的设备有摄像头,并且录制完成,那么在录制视频后,如果用户单击done按钮,那么我将把结果(录制视频的地址)发送回主活动。
如何检查主活动的结果?
在Kotlin
假设A和B是活动,导航来自A -> B
我们需要A <- B的结果
in A
// calling the Activity B
resultLauncher.launch(Intent(requireContext(), B::class.java))
// we get data in here from B
private var resultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
when (result.resultCode) {
Activity.RESULT_OK -> {
result.data?.getStringExtra("VALUE")?.let {
// data received here
}
}
Activity.RESULT_CANCELED -> {
// cancel or failure
}
}
}
In B
// Sending result value back to A
if (success) {
setResult(RESULT_OK, Intent().putExtra("VALUE", value))
} else {
setResult(RESULT_CANCELED)
}
在Kotlin
假设A和B是活动,导航来自A -> B
我们需要A <- B的结果
in A
// calling the Activity B
resultLauncher.launch(Intent(requireContext(), B::class.java))
// we get data in here from B
private var resultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
when (result.resultCode) {
Activity.RESULT_OK -> {
result.data?.getStringExtra("VALUE")?.let {
// data received here
}
}
Activity.RESULT_CANCELED -> {
// cancel or failure
}
}
}
In B
// Sending result value back to A
if (success) {
setResult(RESULT_OK, Intent().putExtra("VALUE", value))
} else {
setResult(RESULT_CANCELED)
}
这在Android上是一个非常常见的问题
它可以被分解成三个部分
开始活动B(发生在活动A中)
设置请求的数据(发生在活动B中)
接收请求的数据(发生在活动A中)
startActivity B
Intent i = new Intent(A.this, B.class);
startActivity(i);
设置请求数据
在这一部分中,您将决定在发生特定事件时是否要发回数据。
例如:在活动B中有一个EditText和两个按钮b1, b2。
单击按钮b1将数据发送回活动A。
单击按钮b2不会发送任何数据。
发送数据
b1......clickListener
{
Intent resultIntent = new Intent();
resultIntent.putExtra("Your_key", "Your_value");
setResult(RES_CODE_A, resultIntent);
finish();
}
不发送数据
b2......clickListener
{
setResult(RES_CODE_B, new Intent());
finish();
}
用户单击后退按钮
默认情况下,结果设置为Activity。RESULT_CANCEL响应代码
检索结果
重写onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RES_CODE_A) {
// b1 was clicked
String x = data.getStringExtra("RES_CODE_A");
}
else if(resultCode == RES_CODE_B){
// b2 was clicked
}
else{
// The back button was clicked
}
}