2

Вот мои настройки:Почему Фрагмент пустой внутри onActivityResult

Activity -> FragmentWithPages -> ViewPager{Fragment1, Fragment2}

От Fragment1 я запускаю DialogFragment, а затем из DialogFragment запускает activityForResult неявного намерения камеры, чтобы сделать снимок.

Проблема:

Иногда, возвращаясь из камеры моего приложения аварии внутри onActivityResult из Fragment1. Почему это происходит? Теперь поймите цепочку обратного вызова onActivityResult. Он будет возвращаться в порядке Activity.onActivityResult -> FragmentWithPages.onActivityResult -> Fragment1.onActivityResult -> DialogFragment.onActivityResult. Так что мой вопрос, почему DialogFragment null когда я делаю mDialogFragment.onActivityResult(…)?

Я предполагаю, что это может иметь отношение к памяти: система убивает мое приложение, а затем перезапускает его после возвращения приложения Camera. Но если это так, то почему DialogFragment неработающее звено в цепочке? Что я могу сделать, чтобы предотвратить эту проблему или обработать ее, как будто ничего не случилось?

Нет, я не хочу просто поймать NPE, что на самом деле не так много, поскольку это аннулирует всю цель, для которой я сделал снимок.

+1

Просто обновите ссылку на фрагмент диалога с помощью findFragmentByTag или что-то в этом роде. – dtx12

+0

Это может на самом деле сделать это, но все же очень сложно проверить, как это бывает иногда. Плюс один за помощь. Благодаря! –

ответ

1

Когда вы вернетесь с startActivityForResult(), нет никакой гарантии, что экземпляр активности будет таким же. Система может свободно распоряжаться активностью, которая начиналась для результата, и восстанавливать ее для обработки вызова onActivityResult().

Если это произойдет, это означает, конечно, что все поля экземпляров, которые вы ранее назначили, больше не будут такими. Вам нужно использовать onSaveInstanceState() и восстановить экземпляр своей деятельности, используя сохраненное состояние экземпляра Bundle, переданное вашему onCreate().

Вы можете протестировать этот сценарий, установив «не сохранять действия» в настройках разработчика на своем устройстве.

1

Это обычная ситуация, когда система разрушает вашу деятельность, потому что ей требуется больше ресурсов. Вам необходимо ввести метод onSaveInstanceState, а затем восстановить состояние экземпляра в onCreate или onRestoreInstanceState.

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putExtra("yourData", yourParcelableData); 
} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // keep the fragment and all its data across screen rotation 
    setRetainInstance(true); 
    if(savedInstanceState != null){ 
     yourParcelableData = (yourParcelableData)savedInstanceState.getExtra("yourData"); 
    } 

} 

В библиотеке есть библиотека, которая позволяет вам это сделать проще. https://github.com/frankiesardo/icepick

+0

Спасибо за дублирование именно того, что я написал. Всегда хорошо иметь 2 одинаковых ответа. –