Как управлять "startActivityForResult" на Android?
в моей деятельности я вызываю второе действие из основного действия по startActivityForResult
. В моей второй деятельности есть некоторые методы, которые заканчивают эту деятельность (возможно, без результата), однако только один из них возвращает результат.
например, от основного вида деятельности я называю второй. В этом упражнении я проверяю некоторые функции телефона, такие как есть ли у него камера. Если это не так, то я закрою эту деятельность. Также, во время подготовки MediaRecorder
или MediaPlayer
Если a проблема происходит, то я закрою эту деятельность.
если его устройство имеет камеру и запись выполняется полностью, то после записи видео, если пользователь нажимает на кнопку Готово, я отправлю результат (адрес записанного видео) обратно в основную деятельность.
Как проверить результат от основной деятельности?
9 ответов:
из своего
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's no result } } }//onActivityResult
Как проверить результат от основной деятельности?
вам нужно переопределить
Activity.onActivityResult()
затем проверьте его параметры:
requestCode
определяет, какое приложение вернуло эти результаты. Это определяется вами при вызовеstartActivityForResult()
.resultCode
сообщает вам, удалось ли это приложение, не удалось или что-то другоеdata
содержит любую информацию, возвращенную этим приложением. Это может бытьnull
.
дополняя ответ от @Nishant, лучший способ вернуть результат активности:
Intent returnIntent = getIntent(); returnIntent.putExtra("result",result); setResult(RESULT_OK,returnIntent); finish();
у меня были проблемы с
new Intent();
затем я узнал, что правильный способ использует
getIntent();
чтобы получить текущее намерение
пример
чтобы увидеть весь процесс в контексте, вот дополнительный ответ. Смотрите мой более полный ответ для более подробного объяснения.
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(); } }
Если вы хотите обновить пользовательский интерфейс с результатом деятельности, вы не можете использовать
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; } }
Это кажется глупым, но работает довольно хорошо.
для тех, у кого есть проблемы с неверный код запроса в onActivityResult
если вы звоните
startActivityForResult()
из своегоFragment
, код запроса изменяется действием, которому принадлежит фрагмент.если вы хотите получить правильный resultCode в вашей деятельности, попробуйте это:
изменения:
startActivityForResult(intent, 1);
To:
getActivity().startActivityForResult(intent, 1);
сначала вы используете
startActivityForResult()
с параметрамиActivity
и если вы хотите отправить данные из второгоActivity
до первого передать значение с помощьюIntent
СsetResult()
метод и получить эти данные внутриonActivityResult()
Способ первыйActivity
.
очень распространенная проблема, в Android
он может быть разбит на 3 части
1) запустить действие B (происходит в действии A)
2) установить запрошенные данные (происходит в activty B)
3 ) Получение запрошенных данных (происходит в деятельности)1) startActivity B
Intent i = new Intent(A.this, B.class); startActivity(i);
2) установить запрашиваемые сведения
в этой части вы решаете, хотите ли вы отправить данные обратно или нет, когда происходит определенное событие.
Например: в упражнении B есть EditText и две кнопки b1, b2.
Нажатие на кнопку b1 отправляет данные обратно в actvity a
Нажатие на кнопку b2 не отправляет никаких данных.передача данных
b1......clickListener { Intent resultIntent = new Intent(); resultIntent.putExtra("Your_key","Your_value"); setResult(RES_CODE_A,resultIntent); finish(); }
не обменивались данными!--7-->
b2......clickListener { setResult(RES_CODE_B,new Intent()); finish(); }
пользователь нажимает кнопку Назад
По умолчанию результат устанавливается с активностью.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 } }
anwser @Nishant является правильным. В моем случае onActivityResult никогда не вызывался из-за настроек в AndroidManifest. Убедитесь, что ваше второе действие (или отправитель) не установил эту строку в Манифесте Android.
<activity android:name=".SecondViewActivity" android:parentActivityName=".FirstActivity"/>
Если это так, пожалуйста, удалить
android:parentActivityName=".FirstActivity"