Вопрос по android – Как управлять startActivityForResult на Android?

861

В своей деятельности я называю второе действие из основного действияstartActivityForResult, В моем втором задании есть несколько методов, которые завершают это задание (возможно, без результата), однако только один из них возвращает результат.

Например, из основной деятельности я называю второй. В этом упражнении я проверяю некоторые функции телефона, например, имеет ли он камеру. Если этого не произойдет, то я закрою это действие. Также во время приготовленияMediaRecorder или жеMediaPlayer если возникнет проблема, тогда я закрою это действие.

Если на его устройстве установлена камера, и запись завершена полностью, то после записи видео, если пользователь нажимает кнопку «Готово», я отправляю результат (адрес записанного видео) обратно в основное действие.

Как я могу проверить результат основной деятельности?

Ваш Ответ

8   ответов
44

How to check the result from the main activity?

Вы должны переопределитьActivity.onActivityResult() затем проверьте его параметры:

  • requestCode identifies which app returned these results. This is defined by you when you call startActivityForResult().
  • resultCode informs you whether this app succeeded, failed, or something different
  • data holds any information returned by this app. This may be null.
Error: User Rate Limit ExceededEdit:Error: User Rate Limit Exceededstackoverflow.com/questions/5104269/…
31

Example

Чтобы увидеть весь процесс в контексте, вот дополнительный ответ. Увидетьмой полный ответ для большего объяснения.

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();
    }
}
Error: User Rate Limit Exceededstackoverflow.com/questions/52975645/…
10

Если вы хотите обновить пользовательский интерфейс с результатом активности, вы не можете использоватьthis.runOnUiThread(new Runnable() {} При этом пользовательский интерфейс не будет обновл тьс новым значением. Вместо этого вы можете сделать это:

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

Это кажется глупым, но работает довольно хорошо.

1

Очень распространенная проблема в Android
It can be broken down into 3 Pieces
1) начать упражнение B (происходит в упражнении A)
2) Установите запрошенные данные (происходит в действии B)
3) Получить запрошенные данные (происходит в действии А)

1) startActivity B

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

2) Set requested data

В этой части вы решаете, хотите ли вы отправлять данные обратно или нет, когда происходит определенное событие.
Например: в действии 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) Retrieve result

Для этого переопределить метод 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 
}
}
2233

От твоегоFirstActivity позвонитьSecondActivity с помощьюstartActivityForResult() метод

Например:

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
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededSecondActivityError: User Rate Limit ExceededFirstActivityError: User Rate Limit Exceeded"RESULT_CANCELLED"Error: User Rate Limit ExceededFirstActivtyError: User Rate Limit ExceededFirstActivity's' 'onActivityResult()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
11

Для тех, у кого проблемы снеправильный requestCode в onActivityResult

Если вы звонитеstartActivityForResult() от твоегоFragmentкод запроса изменяется действием, которому принадлежит фрагмент.

Если вы хотите получить правильный код результата в вашей деятельности, попробуйте это:

Изменить:

startActivityForResult(intent, 1); Для того, чтобы:

getActivity().startActivityForResult(intent, 1);

2

Сначала вы используетеstartActivityForResult() с параметрами в первую очередьActivity и если вы хотите отправить данные со второгоActivity к первомуActivity затем передать значение с помощьюIntent сsetResult() метод и получить эти данные внутриonActivityResult() метод в первую очередьActivity.

38

В дополнение к ответу от @ Nishant, лучший способ вернуть результат активности:

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

У меня были проблемы с

new Intent();

Тогда я узнал, что правильный путь использует

getIntent();

чтобы получить текущее намерение

Error: User Rate Limit ExceededgetIntent()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededIntentError: User Rate Limit ExceededBundleError: User Rate Limit ExceededIntentError: User Rate Limit ExceededIntentError: User Rate Limit Exceededgithub.com/aosp-mirror/platform_frameworks_base/blob/…

Похожие вопросы