RESULT_OK 的 startActivityForResult 和 setResult 不起作用

startActivityForResult and setResult with RESULT_OK does not work

我不确定这是否是预期的行为,但如果我在 OneActivity 中执行以下操作以启动 TwoActivity:

Intent intent = new Intent(this, TwoActivity.class);
startActivityForResult(intent, RESULT_OK);

然后在 TwoActivity 当我传回 OneActivity:

Intent resultIntent = new Intent();
resultIntent.putExtra(SOURCE, TAG);
setResult(RESULT_OK, resultIntent);

finish();

使用上面的代码并在 OneActivity 中覆盖 onActivityResult 之后没有任何反应。 onActivityResult 似乎甚至没有被调用。但是,如果我将 RESULT_OK 更改为 0,它会起作用。

这是预期的吗?还有其他人经历过吗?

查看 startActivityForResult 方法的文档定义。它说:

requestCode int: If >= 0, this code will be returned in onActivityResult() when the activity exits.

所以你的请求码应该>=0。如果你检查RESULT_OK响应码的值,它是-1。请务必注意,请求代码与结果代码不同。请求码用于识别结果所针对的请求,结果码告诉你请求是否成功。

您混淆了两个不同的概念:

  • requestCodestartActivityForResult 的第二个参数)是您分配的唯一 ID,可以是任何正整数。
  • resultCodesetResult 的第一个参数)必须是 Activity class 中的常量之一,如 setResult documentation

您会注意到您的 onActivityResult 收到了您传递给 startActivityForResultrequestCode resultCode您已在 setResult 中设置 - 确保您比较的是 onActivityResult

中的正确数字

请使用此示例检查您的代码:

主要活动:

public class MainActivity extends Activity {  
    TextView textView1;  
    Button button1;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        textView1=(TextView)findViewById(R.id.textView1);  
        button1=(Button)findViewById(R.id.button1);  
        button1.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View arg0) {  
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);  
                startActivityForResult(intent, 2);// Activity is started with requestCode 2  
            }  
        });  
    }  
 // Call Back method  to get the Message form other Activity  
    @Override  
       protected void onActivityResult(int requestCode, int resultCode, Intent data)  
       {  
                 super.onActivityResult(requestCode, resultCode, data);  
                  // check if the request code is same as what is passed  here it is 2  
                   if(requestCode==2)  
                         {  
                            String message=data.getStringExtra("MESSAGE");   
                            textView1.setText(message);  
                         }  
     }  
}  

然后是 SecondActivity:

public class SecondActivity extends Activity {  
    EditText editText1;  
    Button button1;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_second);  
        editText1=(EditText)findViewById(R.id.editText1);  
            button1=(Button)findViewById(R.id.button1);  
            button1.setOnClickListener(new OnClickListener() {  
                @Override  
                public void onClick(View arg0) {  
                    String message=editText1.getText().toString();  
                    Intent intent=new Intent();  
                    intent.putExtra("MESSAGE",message);  
                    setResult(2,intent);  
                    finish();//finishing activity  
                }  
            });  
    }