Как вернуть результат (startActivityForResult) из действия TabHost?

StackOverflow https://stackoverflow.com/questions/2497205

Вопрос

В моем примере есть 3 класса:Класс А, основной вид деятельности.Класс A вызывает startActivityForResult:

Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");

Класс B, этот класс представляет собой TabActivity:

Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...

Класс C, этот класс является обычным действием:

Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();

onActivityResult вызывается в классе A, но resultCode RESULT_CANCELED вместо RESULT_OK и возвращенное намерение является нулевым.Как мне вернуть что-то из действия внутри TabHost?

Я понимаю, что проблема в том, что мой класс C на самом деле работает внутри класса B, а класс B возвращает RESULT_CANCELED вернуться в класс А.Я просто еще не знаю обходного пути.

Это было полезно?

Решение

О Боже!Потратив несколько часов на загрузку исходников Android, я наконец пришел к решению.

Если вы посмотрите на класс Activity, вы увидите, что finish() метод отправляет обратно результат только в том случае, если есть mParent свойство установлено в null.В противном случае результат будет потерян.

public void finish() {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
        try {
            if (ActivityManagerNative.getDefault()
                .finishActivity(mToken, resultCode, resultData)) {
                mFinished = true;
            }
        } catch (RemoteException e) {
            // Empty
        }
    } else {
        mParent.finishFromChild(this);
    }
}

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

Intent data = new Intent();
 [...]
if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
} else {
    getParent().setResult(Activity.RESULT_OK, data);
}
finish();

Я надеюсь, что это будет полезно, если кто-то снова найдет решение этой проблемы.

Другие советы

http://tylenoly.wordpress.com/2010/10/27/how-to-finish-activity-with-results/

С небольшой модификацией «param_result».

/* Start Activity */
public void onClick(View v) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setClassName("com.thinoo.ActivityTest", "com.thinoo.ActivityTest.NewActivity");
    startActivityForResult(intent,90);
}
/* Called when the second activity's finished */
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
    case 90:
        if (resultCode == RESULT_OK) {
            Bundle res = data.getExtras();
            String result = res.getString("param_result");
            Log.d("FIRST", "result:"+result);
        }
        break;
    }
}

private void finishWithResult()
{
    Bundle conData = new Bundle();
    conData.putString("param_result", "Thanks Thanks");
    Intent intent = new Intent();
    intent.putExtras(conData);
    setResult(RESULT_OK, intent);
    finish();
}

Intent.FLAG_ACTIVITY_FORWARD_RESULT?

Если установлено, и это намерение используется для запуска новой деятельности из существующего, то цель ответа существующей деятельности будет передана в новое действие.

Вы также можете реализовать onActivityResult в классе B и запустить класс C, используя startActivityForResult.Как только вы получите результат в классе B, установите там результат (для класса A) на основе результата из класса C.Я не пробовал это, но думаю, что это должно сработать.

Еще одна вещь, на которую следует обратить внимание, это то, что действие A не должно быть действием с одним экземпляром.Чтобы startActivityForResult работал, ваш класс B должен быть поддействием действия A, а это невозможно в одном действии экземпляра, новое действие (класс B) начинается в новой задаче.

Чтобы запустить действие 2 из действия 1 и получить результат, вы можете использовать startActivityForResult и реализовать onActivityResult в действии 1 и использовать setResult в действии2.

Intent intent = new Intent(this, Activity2.class);
intent.putExtra(NUMERO1, numero1);
intent.putExtra(NUMERO2, numero2);
//startActivity(intent);
startActivityForResult(intent, MI_REQUEST_CODE);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top