2017-01-30 11 views
1

Я просто хочу обменивать информацию об объекте из Activity2 обратно в Activity1, когда нажата кнопка «Назад». Все работает нормально, кроме как в Activity1 onActivityResult(..) никогда не срабатывает. Поэтому я не могу получить доступ к информации о намерениях. Кто-нибудь знает почему?onActivityResult() не запускается on onBackPressed()

Я проверил эти ответы, но они не работают:

setResult does not work when BACK button pressed

How to pass data from 2nd activity to 1st activity when pressed back? - android

How to pass the values from one activity to previous activity

Send data to a parent activity onBackPressed

Мой код (если вам нужно больше, скажите me):

AndroidManifest.xml:

 <activity 
      android:name="com.example.Activity1" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:screenOrientation="portrait"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <activity 
      android:name="com.example.Activity2" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:screenOrientation="portrait"> 
     </activity> 

Activity1.java:

public class MainActivity extends AppCompatActivity { 

    // other stuff... 

    private void showActivity2(Test test) { 
     Intent intent = new Intent(this, Activity2.class); 
     intent.putExtra("test", test.getSerializableObject()); 
     startActivityForResult(intent, Activity.RESULT_OK); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_CANCELED) { 
      Test test = data.getExtras().getParcelable("test"); 
      // Do something... 
     } 
    } 

Activity2.java:

public class Activity2 extends AppCompatActivity { 

    // other stuff.... 

    @Override 
    public void onBackPressed() { 
     Intent intent = new Intent(); 
     intent.putExtra("test", test.getSerializableObject()); 
     setResult(Activity.RESULT_CANCELED, intent); 
     super.onBackPressed(); 
    } 
} 
+0

'onBackPressed()' скорее всего, слишком поздно. Вызовите 'setResult()', когда пользователь делает что-то положительное в вашем пользовательском интерфейсе, чтобы сказать, что он хочет (например, щелкает элемент списка). Обычно вы также называете 'finish()', так как пользователь решил, что они хотят, 'Activity2' больше не требуется. – CommonsWare

+0

Я также пытался установитьResult (xxx), а Activity2 что-то обновляет. Тем не менее ... похоже, что Activity1 обычно игнорирует обратный вызов. – Javatar

ответ

4

Согласно документации андроида для startActivityForResult

Аналогично вызову startActivityForResult (Intent, int, Bundle) без параметров .

намерение намерение: цель начать.

requestCode int: If> = 0, этот код будет возвращен в onActivityResult(), когда действие завершается.

Теперь то, что вы сделали это: startActivityForResult(intent, Activity.RESULT_OK);

Где Activity.RESULT_OK фактическое значение -1, поэтому она не возвращает результат. Для начала действия для получения результата необходимо иметь действительный код запроса, а затем отфильтровать код запроса в onActivityResult.

+0

Правильно. Забавно, что я уже правильно использовал его в другом контексте ... 'startActivityForResult (Intent.createChooser (намерение,« Выбрать фото »), REQUEST_GALLERY);' Теперь он работает правильно! Спасибо. – Javatar

2

Вы не указали код запроса на Activity1.java, вместо этого вы написали Activity.RESULT_OK, который является кодом результата.

startActivityForResult(intent, Activity.RESULT_OK); 

Оно должно быть:

startActivityForResult(intent, REQUEST_CODE); 

REQUEST_CODE должно быть окончательным статическое значение внутр.