ActivityResultLauncher с фрагментом — onActivityResult не вызывается при возврате

avatar
Edgar M
8 августа 2021 в 16:10
431
0
2

app hierarchy

Я надеюсь, что приведенная выше диаграмма дает общее представление о текущей иерархии дизайна моего приложения. MainFragment показывает текущий уровень учетной записи пользователя. Существует карта прогрессии, в которой каждый раздел содержит список задач. Пользователь щелкает раздел, отображается список задач. Например, такая задача — просмотреть видео целиком. Как только это будет сделано, отобразится диалоговое окно повышения уровня, которое подтверждается пользователем нажатием кнопки. Затем пользователь возвращается в MainFragment с обновлением уровня учетной записи.

Я заранее создал тестовое приложение, чтобы понять основные функции ActivityResultLauncher, поскольку startActivityResult теперь устарел. Тестовое приложение немного отличается от диаграммы, для которой вместо фрагмента, вызывающего TaskList, это активность. Тем не менее, это сработало хорошо.

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

Вот код ActivityResultLauncher, который я использую в MainFragment. Он помещается как глобальная переменная.

ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            if (result.getResultCode() == VideoViewer.RESULT_OK) {
                // Level Up
                int level = result.getData().getIntExtra("level", 0);
                Toast.makeText(activity, "LEVEL UP! :D" + level + 1, Toast.LENGTH_SHORT).show();
                Log.i(TAG, "onActivityResult: Called");
            }
        }
    });

Затем я передаю средство запуска в качестве параметра в TaskListDialogFragment следующим образом

TaskListDialog taskListDialog = new TaskListDialog(taskItemList.get(0), level, launcher);
taskListDialog.show(fm, "tasklist");

В диалоговом окне списка задач

// Constructor
public TaskListDialog(TaskItem taskItem, int level, ActivityResultLauncher<Intent> launcher) {
        this.taskItem = taskItem;
        this.level = level;
        this.launcher = launcher;
}

// Launch Intent section
Intent watchVideo = new Intent(TaskListDialog.this.getActivity(), VideoViewer.class);
watchVideo.putExtra("media", response.body());
launcher.launch(watchVideo);

В средстве просмотра видео

// onButtonClick is from DialogListener Interface
@Override
public void onButtonClick() {
    // Task done. Return to MainFragment
    Intent levelReturn = new Intent();
    levelReturn.putExtra("level", accountLevel);
    setResult(VideoViewer.RESULT_OK, levelReturn);
    finish();
}

private void levelUp(int level) {
    FragmentManager fm = getSupportFragmentManager();
    LevelUpDialog levelUpDialog = new LevelUpDialog("Level Up!", level, taskItem);
    levelUpDialog.show(fm, "fragment_level_up");
}

В диалоговом окне LevelUp

public interface DialogListener {
    void onButtonClick();
}

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       // User acknowledges level up. Dismiss and return to MainFragment
       DialogListener dialogListener = (DialogListener) getActivity();
       assert dialogListener != null;
       dialogListener.onButtonClick();
       dismiss();
    }
});

ИЗМЕНИТЬ ОБНОВЛЕНИЕ Как указано в моем ответе на комментарий, я упустил важное различие между тестовым приложением и основным проектом. Поток тестового приложения — Activity > DialogFragment > VideoViewer. Основной поток проекта: Фрагмент > DialogFragment > PreviewActivity > VideoViewer. Это сработало, когда я удалил PreviewActivity из потока. Однако я хотел бы, чтобы пользователь предварительно ознакомился с задачей перед ее выполнением. Я предполагаю, что теперь проблема заключается в том, как я могу получить результат действия после прохождения нескольких действий.

Источник
Code Demon
8 августа 2021 в 23:45
0

Вы должны использовать фрагменты?

Edgar M
9 августа 2021 в 00:31
0

@CodeDemon Спасибо за ответ. Как бы я не хотел, я хочу. Однако я понял, что упустил одно важное отличие, которое я также не выделил здесь. В моем тестовом приложении поток идет от Activity > dialogfragment > videoviewer. В моем проекте это фрагмент > диалоговый фрагмент > предварительная активность > видеопросмотр. Я удалил предварительную активность из потока, и это сработало. Увы, этот поток неверен, так как я хочу, чтобы у пользователя был предварительный просмотр задачи перед ее запуском. Я полагаю, проблема сейчас в том, как я могу получить результат с помощью нескольких действий. Я обновлю свой пост.

Ответы (0)