How to manage startActivityForResult on Android?
在我的活动中,我从
例如,从主活动中,我调用第二个活动。在这个活动中,我正在检查手机的一些功能,比如它是否有摄像头。如果没有,我将关闭此活动。另外,在准备
如果它的设备有一个摄像头,并且录制完全完成,那么在录制视频之后,如果用户单击"完成"按钮,那么我将把结果(录制视频的地址)发送回主活动。
如何检查主要活动的结果?
从你的
例如:
1 2 | Intent i = new Intent(this, SecondActivity.class); startActivityForResult(i, 1); |
在您的
例如:在
1 2 3 4 | Intent returnIntent = new Intent(); returnIntent.putExtra("result",result); setResult(Activity.RESULT_OK,returnIntent); finish(); |
如果不想返回数据:
1 2 3 | Intent returnIntent = new Intent(); setResult(Activity.RESULT_CANCELED, returnIntent); finish(); |
现在在您的
1 2 3 4 5 6 7 8 9 10 11 12 | @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if(resultCode == Activity.RESULT_OK){ String result=data.getStringExtra("result"); } if (resultCode == Activity.RESULT_CANCELED) { //Write your code if there's no result } } }//onActivityResult |
How to check the result from the main activity?
您需要覆盖
requestCode 标识返回这些结果的应用程序。这是您在调用startActivityForResult() 时定义的。resultCode 通知您这个应用程序是成功的、失败的还是其他的data 保存此应用程序返回的任何信息。这可能是null 。
补充@nishant的答案,返回活动结果的最佳方法是:
1 2 3 4 | Intent returnIntent = getIntent(); returnIntent.putExtra("result",result); setResult(RESULT_OK,returnIntent); finish(); |
我有问题
1 | new Intent(); |
然后我发现正确的方法是
1 | getIntent(); |
获得当前意图
例子
为了在上下文中看到整个过程,这里是一个补充答案。更多解释见我的完整答案。
mainactivity.java(主活动.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | public class MainActivity extends AppCompatActivity { // Add a different request code for every activity you are starting from here private static final int SECOND_ACTIVITY_REQUEST_CODE = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //"Go to Second Activity" button click public void onButtonClick(View view) { // Start the SecondActivity Intent intent = new Intent(this, SecondActivity.class); startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE); } // This method is called when the second activity finishes @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // check that it is the SecondActivity with an OK result if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) { if (resultCode == RESULT_OK) { // Activity.RESULT_OK // get String data from Intent String returnString = data.getStringExtra("keyName"); // set text view with string TextView textView = (TextView) findViewById(R.id.textView); textView.setText(returnString); } } } } |
第二活动.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } //"Send text back" button click public void onButtonClick(View view) { // get the text from the EditText EditText editText = (EditText) findViewById(R.id.editText); String stringToPassBack = editText.getText().toString(); // put the String to pass back into an Intent and close this activity Intent intent = new Intent(); intent.putExtra("keyName", stringToPassBack); setResult(RESULT_OK, intent); finish(); } } |
对于那些在OnActivityResult中有错误请求代码问题的人
如果您从您的
如果要在活动中获得正确的结果代码,请尝试以下操作:
变化:
如果要用活动结果更新用户界面,则不能使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_CANCELED) { return; } global_lat = data.getDoubleExtra("LATITUDE", 0); global_lng = data.getDoubleExtra("LONGITUDE", 0); new_latlng = true; } @Override protected void onResume() { super.onResume(); if(new_latlng) { PhysicalTagProperties.this.setLocation(global_lat, global_lng); new_latlng=false; } } |
这看起来很傻,但效果很好。
首先在第一个
Android中非常常见的问题它可以分成三部分1)启动活动B(在活动A中发生)2)设置请求的数据(在活动B中发生)3)接收请求的数据(发生在活动A中)
1) startActivity B
1 2 | Intent i = new Intent(A.this, B.class); startActivity(i); |
2) Set requested data
在本部分中,您将决定在发生特定事件时是否发送数据。在活动B中有一个编辑文本和两个按钮b1、b2。单击按钮b1将数据发送回活动a单击按钮b2不会发送任何数据。
发送数据
1 2 3 4 5 6 7 | b1......clickListener { Intent resultIntent = new Intent(); resultIntent.putExtra("Your_key","Your_value"); setResult(RES_CODE_A,resultIntent); finish(); } |
不发送数据
1 2 3 4 5 | b2......clickListener { setResult(RES_CODE_B,new Intent()); finish(); } |
用户单击后退按钮默认情况下,使用activity.result_cancel response code设置结果。
3) Retrieve result
对于该重写OnActivityResult方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @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{ // back button clicked } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | You need to override Activity.onActivityResult() @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_CODE_ONE) { String a = data.getStringExtra("RESULT_CODE_ONE"); } else if(resultCode == RESULT_CODE_TWO){ // b was clicked } else{ } } |