Android 你能从链接的 startActivityForResult 中获取活动结果吗
Posted
技术标签:
【中文标题】Android 你能从链接的 startActivityForResult 中获取活动结果吗【英文标题】:Android Can you get an activity result from a chained startActivityForResult 【发布时间】:2013-11-15 08:10:56 【问题描述】:我有以下活动屏幕
Activity A - 包含一个链接到 Activity B 的按钮
活动 B - 包含订单确认,然后是打开活动 C(以获取签名)的下一步按钮
Activity C - 弹出一个对话框供用户输入他们的签名和一个完整的按钮。
Activity A - 包含启动 Activity B 的意图并实现 onActivityForResult
Intent intent = new Intent( this, ConfirmLines.class );
startActivityForResult( intent, GET_SIGNATURE );
protected void onActivityResult( int requestCode, int resultCode, Intent intent )
super.onActivityResult( requestCode, resultCode, intent );
switch ( requestCode )
case GET_SIGNATURE:
if ( resultCode == RESULT_OK )
getIntent().putExtra( SIGNATURE_DATA, intent.getStringExtra( SignatureCapture.SIGNATURE_RESULT ) );
getIntent().putExtra( SIGNATURE_TIME, "34552655544" ); // todo - remove hardcoded signature time
showDialog( PRINT_NAME );
else
//reset data after a cancel/back from signature screen
getIntent().putExtra( SignatureCapture.SIGNATURE_RESULT, "" );
break;
Activity B - 包含启动 Intent 以捕获签名的代码以及返回到 Activity A 的 onActivityForResult。
final Intent intent = new Intent( this, SignatureCapture.class );
startActivityForResult( intent, GET_SIGNATURE );
@Override
protected void onActivityResult( int requestCode, int resultCode, Intent intent )
super.onActivityResult( requestCode, resultCode, intent );
switch ( requestCode )
case GET_SIGNATURE:
if ( resultCode == RESULT_OK )
finish();
活动 C - 包含签名捕获的代码和一个完整的按钮
public void onClick( View view )
switch ( view.getId() )
case R.id.button_cancel:
dismiss();
nameValue.setText( "" );
notesValue.setText( "" );
imageView_button.setImageBitmap( null );
break;
case R.id.button_confirm:
final String printedText = String.valueOf( nameValue.getText() );
if ( printedText.isEmpty() )
Toast.makeText( getContext(), "Please enter a name", Toast.LENGTH_SHORT ).show();
else
if ( mDialogResult != null )
mDialogResult.finish( String.valueOf( nameValue.getText() ), String.valueOf( notesValue.getText() ) );
nameValue.setText( "" );
notesValue.setText( "" );
dismiss();
break;
当我返回到 Activity A 时,我卡住了,resultCode 等于 0,这被定义为结果被取消。
它正在获取最初从活动 A 开始的正确 requestCode,但似乎只是这个 resultCode 是问题所在,如果有人能明白为什么?
会不会是从Activity C返回的时候调用Activity B的finish()?
另外,我需要将 Intent 数据从 Activity C 传递到 A。如果我在 Activity B 中有 finish(),如果我为 Activity A 启动Activity,它就不会进入 onActivityForResult。
感谢高级帮助:]
【问题讨论】:
由于在Activity B打开了一个对话框,就在两者的中间,它阻碍了流程回到Activity A,我不得不在对话框中调用finish() onStop 方法。我仍然遇到的一个问题是让 Activity A 在其 onActivityForResult 方法中接收从 Activity C 传递的意图。该方法的意图变量似乎为空。 想出了如何将意图链接起来。在 setResult() 方法中,您还可以设置您希望传回的意图,因此我在 Activity B 中调用了 setResult(RESULT_OK, getIntent()),这似乎已经成功了。最初我调用了 setIntent(),然后只设置了结果代码,所以我有点不确定在 setIntent() 或 setResult() 中设置意图之间的区别。但据我了解,您将数据设置为返回到启动它的活动,而 setIntent 正在设置在调用 getIntent 时返回的意图。 【参考方案1】:如果您想将 Activity C 的结果传递回 Activity A:
从活动 A 开始活动 B:
Intent showB = new Intent(ActivityA, ActivityB);
startActivityForResult(showB, RequestCode);
在活动 B 中调用 C:
Intent showC = new Intent(ActivityC);
showC.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(showC);
finish(); //Close Activity B
在 C 中:
//set the result code and close the activity
Intent result = new Intent();
setResult(resultCode, result);//like RESULT_OK
finish();
在 A 中:
public void onActivityResult(int requestCode, int resultCode, Intent data)
...... handle RequestCode here
【讨论】:
但是从C到B没有backstack?【参考方案2】:从Activity C返回时,可能与从Activity B调用finish()有关吗?
是的。您需要在
的 Activity B 中将结果设置为 OKcase GET_SIGNATURE:
if ( resultCode == RESULT_OK )
// here you need set it to OK before calling finish
finish();
也是。
【讨论】:
是的,非常感谢!现在我试图弄清楚如何将数据传回。我是否必须链接它,将数据从一个活动传递到下一个活动? 很高兴它有帮助。是的,你是对的。你也必须把它锁起来。以上是关于Android 你能从链接的 startActivityForResult 中获取活动结果吗的主要内容,如果未能解决你的问题,请参考以下文章
discord.py 你能从 discord 标签中获取用户对象吗?
你能从 Heroku dynos/workers 中获得多少性能?