Как управлять "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;
}
}
Это кажется глупым, но работает довольно хорошо.
для тех, у кого есть проблемы с неверный requestCode в onActivityResult
если вы звоните startActivityForResult()
из своего Fragment
, requestCode изменяется действием, которому принадлежит фрагмент.
если вы хотите получить правильный resultCode в своей деятельности, попробуйте следующее:
изменения:
startActivityForResult(intent, 1);
в:
getActivity().startActivityForResult(intent, 1);
сначала вы используете startActivityForResult()
с параметрами Activity
и если вы хотите отправить данные из второго Activity
до первого Activity
затем передайте значение с помощью Intent
С setResult()
метод и получить эти данные внутри onActivityResult()
Способ первый Activity
.
очень распространенная проблема, в Android
он может быть разбит на 3 части
1) запустить действие B (происходит в действии A)
2) установить запрошенные данные (происходит в activty B)
3) получать запрошенные данные (происходит в действии A)
1) startActivity B
Intent i = new Intent(A.this, B.class);
startActivity(i);
2) установить запрашиваемые сведения
в этой части вы решаете, хотите ли вы отправить данные обратно или нет, когда происходит определенное событие.
Например: в activity 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();
}
пользователь нажимает кнопку Назад
По умолчанию результат задается с помощью 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
}
}
anwser @Nishant является правильным. В моем случае onActivityResult никогда не вызывался из-за настроек в AndroidManifest. Убедитесь, что ваше второе действие (или отправитель) не установило эту строку в Манифесте Android.
<activity android:name=".SecondViewActivity"
android:parentActivityName=".FirstActivity"/>
Если да, пожалуйста, удалите android:parentActivityName=".FirstActivity"