2013-03-05 2 views
2

Я только что заметил странную проблему, которая у меня была в моем приложении. Когда я запускаю свое приложение, если я его минимизирую, перейдите в настройки и измените язык, затем возобновите мое приложение (обратите внимание: это минимизация/возобновление, а не выход/запуск), он вызывает onCreate() Activity вместо вызова onResume() ,Минимизация приложения, изменение языка и возобновление вызовов onCreate() вместо onResume()

Это вызывает множество проблем, особенно в тех областях, где я использую фрагменты в представлении. Отображаемыми фрагментами являются старые фрагменты, но ссылка на активность, которую они удерживают, равна null. Таким образом, getActivity() не работает сразу после возобновления, вызывая NullPointerException во многих местах.

Мое приложение создается для Android 4.0.4 и выше, и я заметил эту проблему на разных устройствах и эмуляторах, поэтому это не проблема платформы.

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

Приложение поддерживает только один язык: английский (США).

Неужели кто-нибудь сталкивался с этой проблемой раньше? Если да, можете ли вы решить его?

РЕДАКТИРОВАТЬ: Основываясь на ответе укладчика класса, Кажется, мне нужно самому сменить конфигурацию. Что должно быть хорошо, за исключением того, что исключение выбрасывается в самом onCreate(). Я звоню getWindow().setRequestFeature(Window.FEATURE_INDETERMINATE_PROGRESS) в onCreate(). Когда локация изменяется, эта строка бросает RuntimeException, говоря, что это должно быть вызвано до setContentView().

Означает ли это, что моя деятельность не разрушается должным образом?

+0

Что касается вашего редактирования, убедитесь: _Do_ вы вызываете 'setRequestFeature()' перед 'setContentView()'? –

+0

Определенно. Все мои действия наследуются от BaseActivity. Функция setRequestFeature вызывается в onCreate() базовой активности, которая вызывается в onCreate() моих отдельных действий. Только после этого я вызываю setContentView() в своей деятельности. –

+0

Поскольку мое приложение поддерживает только один язык, я могу «исправить» его, установив в моем манифесте configChanges = «locale», но я хотел бы оставить это в качестве крайней последней меры. –

ответ

3

Это не проблема, это по дизайну.

Если язык изменяется, это изменение конфигурации, равно как и поворот экрана.

Это означает, что необходимо восстановить много вещей. Следовательно, это обрабатывается через onCreate().

Извините за плохие новости, но вам нужно будет исправить место, где вы создаете объекты, и как inCreate amnd onResume взаимодействовать.

См. here.

Edit: Что касается RuntimeException, чтобы быть на безопасной стороне, вызовите getWindow().setRequestFeature(Window.FEATURE_INDETERMINATE_PROGRESS) перед тем super.onCreate(savedInstanceState), как вы выяснили, во время нашей беседы.

+0

Хм .. я вижу. Дело в том, что это не будет проблемой. Моя активность воссоздает себя прекрасно. Проблема в том, что фрагменты, живущие в одной и той же деятельности, не разрушаются, что вызывает проблему. Я попробую воссоздать их и посмотреть, что произойдет. –

+0

@VinaySShenoy Возможно, необходимо сохранить некоторые данные в объекте «неконфигурации», но это зависит от характера того, что вы на самом деле показываете, есть ли у вас асинхронные задачи и т. Д. –

+0

см. Мой обновленный вопрос. –

1

Поместите эти строки в файл манифеста и посмотрите, работает ли он.

<activity 
     android:name="youractivity" 
     android:configChanges="locale|layoutDirection" 
     android:label="youractivitylabel" /> 
+1

Ницца! Это сработало для меня! –

0

У меня была такая же проблема с исключениями из нулевого указателя во фрагментах после изменения локали. Для справки в будущем я разделяю решение, которое я нашел полезным в своем случае. В осколке onCreateView() просто добавьте эту строку:

this.setRetainInstance(true); 

Это предотвращает вызывая onDestroy() и onCreate().Вместо этого будут вызываться onDetach() и onAttach(Activity). Это помогло мне, надеюсь, что это поможет другим, которые приходят на эту страницу. См. reference.

Смежные вопросы