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

У меня есть 3 класса в моем примере: Класс A, основной вид деятельности. Класс 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 назад к Классу A. Я просто еще не знаю работу вокруг.

273
задан MiguelHincapieC 17 September 2015 в 06:13
поделиться

2 ответа

О боже! Проведя несколько часов и загрузив исходники 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();

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

366
ответ дан 23 November 2019 в 02:13
поделиться

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

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

1
ответ дан 23 November 2019 в 02:13
поделиться
Другие вопросы по тегам:

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