После того, как я внесу некоторые изменения в свою базу данных, которые повлекут за собой существенное изменение моих представлений, я хотел бы перерисовать, повторно выполнить onCreate.
Как такое возможно?
ОБНОВЛЕНИЕ : в Android SDK 11 добавлен recreate()
метод действий.
Я сделал это, просто повторно используя намерение, с которого началось действие. Определите намерение starterIntent
в своем классе и назначьте его onCreate()
использованию starterIntent = getIntent();
. Затем, когда вы захотите перезапустить действие, позвонитеfinish(); startActivity(starterIntent);
Это не очень элегантное решение, но это простой способ перезапустить вашу деятельность и заставить ее перезагрузить все.
finish()
сразу после этогоstartActivity()
именно по этой причине ...finish();
Тогда я добился этого, позвонив первымstartActivity(starterIntent);
Вызовите метод воссоздания действия.
источник
recreate()
но теперь я вижу странную проблему, когда переключатели не сбрасываются при воссоздании, но они сбрасываются, когдаfinish(); startActivity(getIntent());
я использую это сейчас и смотрю, как это будет работать в следующие дни или недели.Комбинируя здесь несколько ответов, вы можете использовать что-то вроде следующего.
тестирование
Я немного тестировал, и есть некоторые проблемы:
startActivity(...); finish();
только существующее приложение и не перезапускается действие.super.recreate()
на самом деле не действует так же, как полное воссоздание деятельности. Это эквивалентно вращению устройства, поэтому, если у вас есть какие-либоFragment
s,setRetainInstance(true)
они не будут воссозданы; просто приостановился и возобновился.Так что в настоящее время я не верю, что есть приемлемое решение.
источник
Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
вместо использования11
startActivity(getIntent());finish();
наfinish();startActivity(getIntent());
Опция 1
Звоните
recreate()
на свойActivity
. Однако этот метод вызывает появление мигающего черного экрана во время повторного создания действия.Вариант 2
Здесь нет «мигающего» черного экрана, но вы увидите переход между старым и новым экземплярами с не очень приятным черным фоном. Мы можем лучше.
Вариант 3
Чтобы исправить это, мы можем добавить вызов
overridePendingTransition()
:Прощай, черный экран, но в моем случае я все еще вижу какой-то переход (затухание анимации), на этот раз на цветном фоне. Это потому, что вы завершаете текущий экземпляр своего действия до того, как новый будет создан и станет полностью видимым, а промежуточный цвет - это значение
windowBackground
атрибута темы.Вариант 4
При вызове
finish()
послеstartActivity()
будет использоваться переход между действиями по умолчанию, часто с небольшой скользящей анимацией. Но переход все же виден.Вариант 5
Для меня это лучшее решение, потому что оно перезапускает активность без видимого перехода, как будто ничего не произошло.
Это может быть полезно, если, например, в вашем приложении вы предоставляете способ изменить язык отображения независимо от языка системы. В этом случае всякий раз, когда пользователь меняет язык вашего приложения, вы, вероятно, захотите перезапустить свою деятельность без перехода, чтобы переключение языка выглядело мгновенно.
источник
Когда мне нужно перезапустить действие, я использую следующий код. Хотя это не рекомендуется.
источник
для API до 11 вы не можете использовать воссоздать (). Я решил так:
и в onCreate ..
источник
После поиска имбирного пряника
recreate
я хотел бы использовать следующие коды (для имбирного пряника):Для этих кодов это реализация в более высоком API.
Api-10 не имеет requestRelaunchActivity, однако из сравнения я обнаружил следующее:
Поэтому я думаю, что мог бы использовать
scheduleRelaunchActivity
вместоrequestRelaunchActivity
.И я написал их с помощью рефлексии:
Я использую эти коды для обратного переноса xposed framework.
источник
Build.VERSION_CODES.ECLAIR_MR1
(v7). Это может работать и на более старых версиях.Вызовите
recreate()
метод, из которого вы хотите воссоздать свою деятельность. Этот метод уничтожит текущий экземпляр Activity с помощью,onDestroy()
а затем воссоздает действие с помощьюonCreate()
.источник
Если это ваша проблема, вам, вероятно, следует реализовать другой способ заполнения представления в Activity. Вместо повторного запуска
onCreate()
вы должны сделать так, чтобыonCreate()
ваш метод заполнения вызывал некоторый аргумент. При изменении данных метод заполнения должен вызываться с другим аргументом.источник
Я решил это с помощью фрагментов . Они обратно совместимы до API 4 за счет использования библиотеки поддержки.
Вы создаете макет-оболочку с FrameLayout в нем.
Пример:
Затем вы создаете FragmentActivity, в котором вы можете заменить FrameLayout в любое время.
Пример:
Во фрагменте, который вы надуваете / заменяете, вы можете использовать onStart и onCreateView, как если бы вы обычно использовали onCreate действия.
Пример:
источник
Также в зависимости от вашей ситуации вам может потребоваться
getActivity().recreate();
вместо простоrecreate()
.Например, вы должны использовать его, если вы работаете
recreate()
в классе, который был создан внутри класса активности.источник
Однажды я сделал тестовое приложение, которое загружает, удаляет, а затем повторно загружает файл базы данных, используя облачное хранилище firebase. Для отображения данных в базе данных единственным решением, которое я нашел, был следующий код. Ни то,
recreate()
ни другоеfinish()
в данном случае не сработало.источник
я нашел лучший способ обновить ваш фрагмент при изменении данных
если у вас есть кнопка "поиск", вы должны инициализировать свой список ARRAY внутри кнопки
mSearchBtn.setOnClickListener (новый View.OnClickListener () {
@Override public void onClick (View v) {
источник
Если вы хотите передать параметр в onCreate (), вам нужно создать новое намерение с добавлением дополнительных и вызвать StartActivity с ним. Вот простой пример, который я использовал таким образом.
источник
Если вы просто хотите переделать свой взгляд, у меня была точно такая же проблема. В
onResume
функции попробуйте поместить это:Это тоже было у меня
onCreate()
, так что положив это на работуonResume
для меня :)источник