Как использовать 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);