首页 文章

如何在Android上管理startActivityForResult?

提问于
浏览
830

在我的活动中,我通过 startActivityForResult 从主要活动中调用第二个活动 . 在我的第二个活动中,有一些方法可以完成此活动(可能没有结果),但是,只有其中一个返回结果 .

例如,从主要活动我称之为第二个 . 在这个活动中,我已经关闭了这个活动 . 此外,在准备 MediaRecorderMediaPlayer 期间如果出现问题,我将关闭此活动 .

如果其设备具有摄像头并且录制完全完成,则在录制视频后如果用户点击完成按钮,则我将结果(录制视频的地址)发送回主活动 .

如何查看主要活动的结果?

8 回答

  • 2

    对于那些有问题的人wrong requestCode in onActivityResult

    如果从 Fragment 调用 startActivityForResult() ,则拥有Fragment的Activity会更改requestCode .

    如果您想在活动中获得正确的resultCode,请尝试以下方法:

    更改:

    startActivityForResult(intent, 1); 致:

    getActivity().startActivityForResult(intent, 1);

  • 10

    Example

    要在上下文中查看整个过程,这是一个补充答案 . 有关更多说明,请参见my fuller answer .

    enter image description here

    MainActivity.java

    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);
                }
            }
        }
    }
    

    SecondActivity.java

    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();
        }
    }
    
  • 10

    FirstActivity 使用 startActivityForResult() 方法调用 SecondActivity

    例如:

    Intent i = new Intent(this, SecondActivity.class);
    startActivityForResult(i, 1);
    

    SecondActivity 中设置要返回 FirstActivity 的数据 . 如果你没有设置任何 .

    例如:如果要发送回数据,请在secondActivity中:

    Intent returnIntent = new Intent();
    returnIntent.putExtra("result",result);
    setResult(Activity.RESULT_OK,returnIntent);
    finish();
    

    如果您不想返回数据:

    Intent returnIntent = new Intent();
    setResult(Activity.RESULT_CANCELED, returnIntent);
    finish();
    

    现在,在FirstActivity类中,为 onActivityResult() 方法编写以下代码 .

    @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
    
  • 34

    首先在第一个 Activity 中使用带有参数的 startActivityForResult() ,如果要将数据从第二个 Activity 发送到第一个 Activity ,然后使用带有 setResult() 方法的 Intent 传递值,并在第一个 Activity 中的 onActivityResult() 方法中获取该数据 .

  • 0

    如何检查主要活动的结果?

    您需要覆盖Activity.onActivityResult()然后检查其参数:

    • requestCode 标识哪个应用返回了这些结果 . 当您调用 startActivityForResult() 时,由您定义 .

    • resultCode 通知您此应用程序是成功,失败还是其他内容

    • data 保存此应用程序返回的任何信息 . 这可能是 null .

  • 2166

    android中非常常见的问题
    It can be broken down into 3 Pieces
    1)开始活动B(活动A中发生)
    2)设置请求的数据(在活动B中发生)
    3)接收请求的数据(在活动A中发生)

    1)startActivity B.

    Intent i = new Intent(A.this, B.class);
    startActivity(i);
    

    2)设置请求的数据

    在此部分中,您可以决定是否要在特定事件发生时发送数据 .
    例如:在活动B中有一个EditText和两个按钮b1,b2 .
    单击按钮b1将数据发送回活动A.
    单击按钮b2不会发送任何数据 .

    Sending data

    b1......clickListener
    {
       Intent resultIntent = new Intent();
       resultIntent.putExtra("Your_key","Your_value");
       setResult(RES_CODE_A,resultIntent);
       finish();
    }
    

    Not sending data

    b2......clickListener
        {
           setResult(RES_CODE_B,new Intent());
           finish();
        }
    

    user clicks back button
    默认情况下,结果使用Activity.RESULT_CANCEL响应代码设置

    3)检索结果

    对于覆盖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{
       // back button clicked 
    }
    }
    
  • 44

    补充@ Nishant的答案,返回活动结果的最佳方法是:

    Intent returnIntent = getIntent();
    returnIntent.putExtra("result",result);
    setResult(RESULT_OK,returnIntent);
    finish();
    

    我遇到了问题

    new Intent();
    

    然后我发现正确的方法是使用

    getIntent();
    

    获得当前的意图

  • 26

    如果要使用活动结果更新用户界面,则无法使用 this.runOnUiThread(new Runnable() {} 这样,UI将不会刷新新值 . 相反,你可以这样做:

    @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;
        }
    }
    

    这看起来很傻,但效果很好 .

相关问题