Как управлять startActivityForResult на Android?
В моей деятельности я вызываю второе действие из основного действия startActivityForResult
. В моем втором действии есть некоторые методы, которые завершают эту деятельность (возможно, без результата), однако только один из них возвращает результат.
Например, из основного действия я вызываю второй. В этом упражнении я проверяю некоторые функции телефона, например, у него есть камера. Если этого не произойдет, я закрою это действие. Кроме того, при подготовке MediaRecorder
или MediaPlayer
, если проблема возникает, я закрою эту операцию.
Если на его устройстве есть камера и запись выполнена полностью, то после записи видео, если пользователь нажимает кнопку "Готово", я отправлю результат (адрес записанного видео) обратно в основное действие.
Как проверить результат из основного действия?
Ответы
Ответ 1
Из вашей FirstActivity
вызовите SecondActivity
с помощью startActivityForResult()
Например:
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
В вашей SecondActivity
установите данные, которые вы хотите вернуть обратно в FirstActivity
. Если вы не хотите возвращаться назад, не устанавливайте ничего.
Например: в SecondActivity
если вы хотите отправить обратно данные:
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
Если вы не хотите возвращать данные:
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
Теперь в вашем классе FirstActivity
напишите следующий код для onActivityResult()
.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
String result=data.getStringExtra("result");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there no result
}
}
}//onActivityResult
Ответ 2
Как проверить результат от основного действия?
Вам нужно переопределить Activity.onActivityResult()
, затем проверить его параметры:
-
requestCode
определяет, какое приложение вернуло эти результаты. Это определяется вами при вызове startActivityForResult()
.
-
resultCode
сообщает, удалось ли это приложение, не удалось или что-то другое
-
data
хранит любую информацию, возвращаемую этим приложением. Это может быть null
.
Ответ 3
Дополняя ответ от @Nishant, лучший способ вернуть результат деятельности:
Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();
У меня возникла проблема с
new Intent();
Затем я узнал, что правильный способ заключается в использовании
getIntent();
чтобы получить текущее намерение
Ответ 4
пример
Чтобы увидеть весь процесс в контексте, вот дополнительный ответ. См. Мой более полный ответ для более подробного объяснения.
MainActivity.java
public class MainActivity extends AppCompatActivity {
// Add a different request code for every activity you are starting from here
private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// "Go to Second Activity" button click
public void onButtonClick(View view) {
// Start the SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
}
// This method is called when the second activity finishes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// check that it is the SecondActivity with an OK result
if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) { // Activity.RESULT_OK
// get String data from Intent
String returnString = data.getStringExtra("keyName");
// set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
SecondActivity.java
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
// "Send text back" button click
public void onButtonClick(View view) {
// get the text from the EditText
EditText editText = (EditText) findViewById(R.id.editText);
String stringToPassBack = editText.getText().toString();
// put the String to pass back into an Intent and close this activity
Intent intent = new Intent();
intent.putExtra("keyName", stringToPassBack);
setResult(RESULT_OK, intent);
finish();
}
}
Ответ 5
Если вы хотите обновить пользовательский интерфейс с результатом деятельности, вы не сможете использовать this.runOnUiThread(new Runnable() {}
При этом пользовательский интерфейс не будет обновляться с новым значением. Вместо этого вы можете сделать это:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_CANCELED) {
return;
}
global_lat = data.getDoubleExtra("LATITUDE", 0);
global_lng = data.getDoubleExtra("LONGITUDE", 0);
new_latlng = true;
}
@Override
protected void onResume() {
super.onResume();
if(new_latlng)
{
PhysicalTagProperties.this.setLocation(global_lat, global_lng);
new_latlng=false;
}
}
Это кажется глупым, но работает очень хорошо.
Ответ 6
Для тех, у кого проблема с неправильным кодом запроса в onActivityResult
Если вы вызываете startActivityForResult()
из вашего Fragment
, код запроса изменяется с помощью Activity, которому принадлежит фрагмент.
Если вы хотите получить правильный результат в своей деятельности, попробуйте следующее:
Изменить:
startActivityForResult(intent, 1);
To:
getActivity().startActivityForResult(intent, 1);
Ответ 7
Сначала вы используете startActivityForResult()
с параметрами в первом Activity
, и если вы хотите отправить данные со второго Activity
на первый Activity
, тогда передайте значение с помощью Intent
с помощью метода setResult()
и получите эти данные внутри onActivityResult()
в первом Activity
.
Ответ 8
Очень распространенная проблема в Android
Это может быть разбито на 3 части
1) начать упражнение B (происходит в упражнении A)
2) Установите запрошенные данные (происходит в действии B)
3) Получить запрошенные данные (происходит в действии А)
1) начало деятельности B
Intent i = new Intent(A.this, B.class);
startActivity(i);
2) Установите запрашиваемые данные
В этой части вы решаете, хотите ли вы отправлять данные обратно или нет, когда происходит определенное событие.
Например: в действии B есть EditText и две кнопки b1, b2.
Нажатие на кнопку b1 отправляет данные обратно в операцию A
Нажатие на кнопку b2 не отправляет никаких данных.
Отправка данных
b1......clickListener
{
Intent resultIntent = new Intent();
resultIntent.putExtra("Your_key","Your_value");
setResult(RES_CODE_A,resultIntent);
finish();
}
Не отправка данных
b2......clickListener
{
setResult(RES_CODE_B,new Intent());
finish();
}
пользователь нажимает кнопку назад
По умолчанию результат устанавливается с кодом ответа Activity.RESULT_CANCEL
3) Получить результат
Для этого переопределить метод onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RES_CODE_A) {
// b1 was clicked
String x = data.getStringExtra("RES_CODE_A");
}
else if(resultCode == RES_CODE_B){
// b2 was clicked
}
else{
// back button clicked
}
}
Ответ 9
Правитель @Нишант прав. В моем случае onActivityResult никогда не вызывался из-за настроек в AndroidManifest. Убедитесь, что ваше второе действие (или отправитель) не установило эту строку в манифесте Android.
<activity android:name=".SecondViewActivity"
android:parentActivityName=".FirstActivity"/>
Если да, удалите android:parentActivityName=".FirstActivity"