Как использовать StartActivityForResult()

В моем приложении мне нужно попросить пользователя быстро input,

Мне нужно получить результат от этой Flash-активности, а затем вернуться к предыдущему.

Я читал о StartActivityForResult() метод, но я пока не уверен, как правильно его использовать, какие-нибудь примеры?

РЕДАКТИРОВАТЬ:

Я попытался передать объект Player через намерение (как результат), используя метод, который я использовал во всех приложениях, примененных к этому методу StartActivityForResult():

В моей второй деятельности (той, где мне нужно получить результат):

Intent intent = new Intent();
Player playerKilled = players.get(position);

Bundle bundle = new Bundle();
bundle.putSerializable("PLAYER_KILLED", (Serializable) playerKilled);
intent.putExtras(bundle);

setResult(Activity.RESULT_OK, intent);
finish();

Моя основная деятельность, где мне нужно взять результат:

if (resultCode == Activity.RESULT_OK) {

    Intent intent = this.getIntent();
    Bundle bundle = intent.getExtras();
    playerKilled = (Player)bundle.getSerializable("PLAYER_KILLED");

    Toast.makeText(this, playerKilled.getName() + "the " + playerKilled.getCardName() + " has died, and he/she had the ID: " + playerKilled.getId(), Toast.LENGTH_SHORT).show();

3 ответа

Решение

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

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

Итак, вы должны понимать, что startActivityForResult() имеет два параметра:

  • Intent (который вы используете для передачи данных между действиями)
  • целое число "код запроса", идентифицирующее ваш запрос

Хорошей практикой является использование константы для вашего кода запроса, к которому вы можете получить доступ в обеих ваших действиях. Например, в вашей основной деятельности вы можете добавить:

public static final int REQUEST_CODE = 1;

Это будет доступно в обоих видах деятельности, так как public, и это будет работать для кода запроса, так как это int (Целое число).

В основном упражнении вам нужно действие (например, нажатие кнопки), чтобы начать второе занятие. Давайте предположим, что нажатие кнопки вызывает это действие:

Button button = (Button) findViewById(R.id.your_button);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // actions that will happen when the button is pressed:

        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, REQUEST_CODE);
    }
});

По сути, мы создаем Intent которая определяет нашу текущую деятельность (this) и второе занятие. Мы используем намерение в startActivityForResult() метод наряду с REQUEST_CODE мы объявили ранее.

Теперь в нашем втором упражнении нам нужно что-то, чтобы инициировать возврат данных. Из предыдущего вопроса, который вы задали, я предполагаю, что вы хотите, чтобы данные возвращались в основное действие, когда RecyclerView пункт был нажат Вот часть моего ответа на этот вопрос, измененная, чтобы показать, как данные будут отправлены обратно.

ExampleClickAdapter clickAdapter = new ExampleClickAdapter(yourObjects);
clickAdapter.setOnEntryClickListener(new ExampleClickAdapter.OnEntryClickListener() {
    @Override
    public void onEntryClick(View view, int position) {
        Intent intent = new Intent();
        intent.putExtra("pos", position);
        setResult(Activity.RESULT_OK, intent);
        finish();
    }
});
recyclerView.setAdapter(clickAdapter);

Вышесказанное отправит обратно позицию элемента списка из RecyclerView щелкнул.

Посмотрите на Intent "s putExtra() метод. Это то, что передает данные. Вы можете видеть, что я передал строку "pos" и переменная для элемента position в этом методе, но почему:

intent.putExtra("key", object);

putExtra метод Intent s всегда используют ключ String и другой объект, такой как ваша целочисленная переменная, position, Ключ будет использоваться снова при получении этого объекта (как я покажу вам позже).

Мы используем Activity.RESULT_OK сказать, что мы передаем результат, но вы можете использовать Activity.RESULT_CANCELED если вы не хотите возвращать результат - это объясняется в ответной ссылке, которую я упоминал в начале. Обратите внимание, что если вы используете Activity.RESULT_CANCELED, вам не нужно использовать putExtra так как было бы нечего отправить обратно.

Наконец, вам нужно добавить что-то в свою основную деятельность, которая будет касаться получения результатов от вашей второй деятельности:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == REQUEST_CODE) {

        if (resultCode == Activity.RESULT_OK) {
            int result = data.getIntExtra("pos");
            // do something with the result

        } else if (resultCode == Activity.RESULT_CANCELED) {
            // some stuff that will happen if there's no result
        }
    }
}

Мы используем onActivityResult метод для этого.

В начале этого метода мы проверяем, requestCode такой же, как тот, который мы определили ранее (как открытая константа, REQUEST_CODE).

Если это так, мы продолжаем и проверяем, что resultCode результата было. Если данные были отправлены обратно (Activity.RESULT_OK), мы можем получить его, используя getIntExtra() как position было целым числом (аналогично, используйте getStringExtra() если вы возвращаете строку). Затем вы можете сделать что-то с возвращенными данными. Однако, если данные не были отправлены обратно (как мы упоминали ранее с Activity.RESULT_CANCELED), вы можете сделать что-то еще.

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

Вы также можете прочитать документацию по Android " Получение результата от действия" и документацию по Android для [ startActivityForResult() метод] ( https://developer.android.com/reference/android/app/Activity.html, int)) и Intent с.

Если я правильно понимаю ваш вопрос, я уверен, что вы хотите это решение:

startActivityForResult(intent, REQUEST_CODE);

просто создайте свою деятельность со списком элементов (recyclerview?), а затем, чтобы запустить ее, чтобы получить результаты, вы в основном создаете свое намерение и вызываете вышеуказанный метод.

Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, SOME_UNIQUE_CODE);

Теперь, когда вы находитесь в списке действий, просто сделайте следующее, когда пользователь выбрал элемент:

intent = new Intent();
intent.putExtra("id", "Some Value Here to return");
setResult(RESULT_OK, intent);
finish();

Таким образом, сразу же, когда пользователь щелкает элемент из списка, вы используете этот код, чтобы вернуть свое значение и закрыть этот список действий.

Наконец, чтобы фактически получить это переданное значение, вы просто переопределяете onActivityResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if (requestCode == REQUEST_CODE){
        if (resultCode == RESULT_OK){

            id = data.getExtras().getString("id");
        }
    }
}

Это все что вам нужно! Я бы сказал, что создание деятельности совершенно нормально, даже если оно выполняет только одно - отображает список элементов! Я надеюсь, это поможет вам! Удачи и счастливого кодирования!

То, что вы можете сделать, это вспомнить действие, которое выглядит как диалог.

В манифесте, где вы объявляете действие, включите тему диалога:

<activity
    android:name="com.myapp.DialogActivity"
    android:theme="@android:style/Theme.Holo.Light.Dialog"
    ...
</activity>

Затем назовите упражнение обычным способом, с результатом, если хотите:

Intent i = new Intent(this, DialogActivity.class);
startActivityForResult(i, REQUEST_CODE);
Другие вопросы по тегам