Фрагмент onActivityResult не вызывается после изменения ориентации
обратите внимание, что этот вопрос не является дубликатом следующего:
- https://stackoverflow.com/questions/19006776/onactivityresult-not-working-with-fragments
- onActivityResult не работает над фрагментами
кроме того, еще аналогичный вопрос был задан раньше, но это не упоминает об изменениях ориентации (и не решен).
мой onActivityResult
метод в Fragment
вызывается, если я не переключаю ориентацию. Однако, если я выполняю эти шаги, он не вызывается:
- загрузить фрагмент в FragmentActivity.
- из фрагмент:
startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), Constants.REQ_CODE_IMAGE_CAPTURE);
- дождитесь загрузки камеры.
- ориентация переключателя.
- сфотографируйте и нажмите галочку.
onActivityResult
по-прежнему вызывается в родительской FragmentActivity. Однако, из-за этого предупреждения я получение:
W/FragmentActivity(4418): Activity result no fragment exists for index: 0x22d73
...я предполагаю, что родитель разрушается из-за изменения ориентации, и после того, как он был воссоздан, не может найти Fragment
это называется startActivityForResult
в первую очередь.
это ошибка фреймворка? Как это можно обойти?
редактировать: добавлено больше кода из-за популярности требовать.
FragmentActivity.java:
...
fragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace (R.id.mainContentView, fragment);
if (clearBackStack) {
// clear the back stack
while (getSupportFragmentManager().popBackStackImmediate ());
// add the current transaction to the back stack
transaction.addToBackStack (null);
}
else {
transaction.addToBackStack(null);
}
transaction.commit();
...
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
}
ExampleFragment.java:
Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePicture, Constants.REQ_CODE_IMAGE_CAPTURE);
...
@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch (requestCode) {
case Constants.REQ_CODE_IMAGE_CAPTURE:
// handle added image
}
}
2 ответов
у меня есть одно решение в настоящее время он работает в моем проекте. выполнить шаги.
--> создать имя интерфейса OnActivityResultListener (или имя, как вы хотите).
открытый интерфейс OnActivityResultListener {
public boolean onActivityResultTest(int request_code, int response_code,
Intent data);
}
--> сделайте рефренс intercace в вашей FragmentActivity как
public OnActivityResultListener activityResultListener;
--> теперь переопределите OnActivityResult в FragmentActivity. как внизу.
@Override
public void onActivityResult(int arg0, int arg1, Intent arg2) {
AppLog.Log(TAG, "onActivityResult");
try {
if (activityResultListener != null) {
activityResultListener.onActivityResultTest(arg0,arg1,arg2);
}
} catch (Exception e) {
e.printStackTrace();
}
super.onActivityResult(arg0, arg1, arg2);
}
--> теперь реализовать интерфейс Фрагмент и переопределение требуемого метода.
@Override
public boolean onActivityResultTest(int requestCode, int resultCode,
Intent data) {
AppLog.Log(TAG, "onActivityResultTest");
if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
isHavePhoto = true;
bitmap = (Bitmap) data.getExtras().get("data");
userEditPhoto.setImageBitmap(bitmap);
}
}
--> и последний шаг внутри метода Onattach класса Fragment регистрирует ваш фрагмент в activity для результата Activity. как
@Override
public void onAttach(Activity activity) {
this.activity = (YOUR_FRAGMENT_ACTIVITY) activity;
this.activity.activityResultListener = this;
super.onAttach(activity);
}
-->теперь проверьте и не забудьте удалить его
@Override
public void onDestroyView() {
activity.activityResultListener = null;
super.onDestroyView();
}
->это какой-то длительный процесс, но он работает 100% в любом направлении.
решил его, переместив все onActivityResult
логику Fragment
до Activity
.
обратите внимание, однако,reqCode
это передается в Fragment
отличается от reqCode
который доставляется родителю Activity
(один Activity
устанавливается системой, я думаю). Это означало, что я должен был также переместить оригинал startActivityForResult
позвонили из Fragment
до Activity
, а затем создайте метод для вызова его из Fragment
когда необходимый.
если кто-нибудь найдет более элегантный способ, я был бы рад услышать об этом.