Вопрос по android – Как управлять startActivityForResult на Android?
В своей деятельности я называю второе действие из основного действияstartActivityForResult
, В моем втором задании есть несколько методов, которые завершают это задание (возможно, без результата), однако только один из них возвращает результат.
Например, из основной деятельности я называю второй. В этом упражнении я проверяю некоторые функции телефона, например, имеет ли он камеру. Если этого не произойдет, то я закрою это действие. Также во время приготовленияMediaRecorder
или жеMediaPlayer
если возникнет проблема, тогда я закрою это действие.
Если на его устройстве установлена камера, и запись завершена полностью, то после записи видео, если пользователь нажимает кнопку «Готово», я отправляю результат (адрес записанного видео) обратно в основное действие.
Как я могу проверить результат основной деятельности?
How to check the result from the main activity?
Вы должны переопределитьActivity.onActivityResult()
затем проверьте его параметры:
requestCode
identifies which app returned these results. This is defined by you when you callstartActivityForResult()
.resultCode
informs you whether this app succeeded, failed, or something differentdata
holds any information returned by this app. This may benull
.
Example
Чтобы увидеть весь процесс в контексте, вот дополнительный ответ. Увидетьмой полный ответ для большего объяснения.
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;
}
}
Это кажется глупым, но работает довольно хорошо.
Очень распространенная проблема в Android
It can be broken down into 3 Pieces
1) начать упражнение B (происходит в упражнении A)
2) Установите запрошенные данные (происходит в действии B)
3) Получить запрошенные данные (происходит в действии А)
1) startActivity B
Intent i = new Intent(A.this, B.class);
startActivity(i);
2) Set requested data
В этой части вы решаете, хотите ли вы отправлять данные обратно или нет, когда происходит определенное событие.
Например: в действии B есть EditText и две кнопки b1, b2.
Нажатие на кнопку b1 отправляет данные обратно в операцию A
Нажатие на кнопку b2 не отправляет никаких данных.
Sending data
b1......clickListener
{
Intent resultIntent = new Intent();
resultIntent.putExtra("Your_key","Your_value");
setResult(RES_CODE_A,resultIntent);
finish();
}
Not sending data
b2......clickListener
{
setResult(RES_CODE_B,new Intent());
finish();
}
user clicks back button
По умолчанию результат устанавливается с кодом ответа Activity.RESULT_CANCEL
3) Retrieve result
Для этого переопределить метод 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
}
}
От твоего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
Для тех, у кого проблемы снеправильный requestCode в onActivityResult
Если вы звонитеstartActivityForResult()
от твоегоFragment
код запроса изменяется действием, которому принадлежит фрагмент.
Если вы хотите получить правильный код результата в вашей деятельности, попробуйте это:
Изменить:
startActivityForResult(intent, 1);
Для того, чтобы:
getActivity().startActivityForResult(intent, 1);
В дополнение к ответу от @ Nishant, лучший способ вернуть результат активности:
Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();
У меня были проблемы с
new Intent();
Тогда я узнал, что правильный путь использует
getIntent();
чтобы получить текущее намерение
Intent
Error: User Rate Limit ExceededBundle
Error: User Rate Limit ExceededIntent
Error: User Rate Limit ExceededIntent
Error: User Rate Limit Exceededgithub.com/aosp-mirror/platform_frameworks_base/blob/…