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 中将结果设置为 OK
case GET_SIGNATURE:
if ( resultCode == RESULT_OK )

    // here you need set it to OK before calling finish
    finish();

也是。

【讨论】:

是的,非常感谢!现在我试图弄清楚如何将数据传回。我是否必须链接它,将数据从一个活动传递到下一个活动? 很高兴它有帮助。是的,你是对的。你也必须把它锁起来。

以上是关于Android 你能从链接的 startActivityForResult 中获取活动结果吗的主要内容,如果未能解决你的问题,请参考以下文章

discord.py 你能从 discord 标签中获取用户对象吗?

你能从 Django 的模板中检查互联网协议吗?

你能从 Heroku dynos/workers 中获得多少性能?

你能从 sklearn 网格搜索 (GridSearchCV) 中获得所有估计器吗?

你能从 OTM ROM 中提取 blob 吗?

你能从继承普通表单的自定义表单继承吗