Depois de fazer algumas mudanças em meu banco de dados, que envolvem mudanças significativas em minhas visualizações, eu gostaria de redesenhar, reexecutar onCreate.
Como isso é possível?
ATUALIZAÇÃO : Android SDK 11 adicionou um recreate()
método às atividades.
Eu fiz isso simplesmente reutilizando a intenção que iniciou a atividade. Defina uma intenção starterIntent
em sua classe e atribua-a ao onCreate()
uso starterIntent = getIntent();
. Então, quando quiser reiniciar a atividade, liguefinish(); startActivity(starterIntent);
Não é uma solução muito elegante, mas é uma maneira simples de reiniciar sua atividade e forçá-la a recarregar tudo.
finish()
imediatamente depois dostartActivity()
justamente por esse motivo ...finish();
entãostartActivity(starterIntent);
Chame o método recriar da atividade.
fonte
recreate()
mas agora vejo um problema estranho em que os botões de opção não são redefinidos durante a recriação, mas eles são redefinidos quandofinish(); startActivity(getIntent());
estou usando isso por agora e ver como funciona nos próximos dias ou semanas.Combinando algumas respostas aqui, você pode usar algo como o seguinte.
Testando
Eu testei um pouco e existem alguns problemas:
startActivity(...); finish();
apenas existe o aplicativo e não reinicia a atividade.super.recreate()
na verdade, não age da mesma maneira que recriar totalmente a atividade. É equivalente a girando o dispositivo por isso, se você tiver quaisquerFragment
s comsetRetainInstance(true)
eles não serão recriados; simplesmente pausou e reiniciou.Portanto, atualmente, não acredito que haja uma solução aceitável.
fonte
Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
em vez de usar11
startActivity(getIntent());finish();
parafinish();startActivity(getIntent());
Opção 1
Ligue
recreate()
para o seuActivity
. No entanto, este método faz com que uma tela preta piscando apareça durante a recriação da atividade.opção 2
Nenhuma tela preta "piscando" aqui, mas você verá uma transição entre as instâncias antigas e novas com um fundo preto não tão agradável. Podemos fazer melhor.
Opção 3
Para corrigir isso, podemos adicionar uma chamada para
overridePendingTransition()
:Adeus tela preta, mas no meu caso ainda vejo algum tipo de transição (uma animação fade), desta vez em um fundo colorido. Isso ocorre porque você está finalizando a instância atual de sua atividade antes que a nova seja criada e se torne totalmente visível, e a cor intermediária é o valor do
windowBackground
atributo theme.Opção 4
Chamar
finish()
depoisstartActivity()
usará a transição padrão entre as atividades, geralmente com uma pequena animação deslizante. Mas a transição ainda é visível.Opção 5
Para mim, esta é a melhor solução porque reinicia a atividade sem nenhuma transição visível, como se nada acontecesse.
Pode ser útil se, por exemplo, em seu aplicativo você expor uma maneira de alterar o idioma de exibição, independentemente do idioma do sistema. Nesse caso, sempre que o usuário alterar o idioma do aplicativo, você provavelmente desejará reiniciar a atividade sem transição, fazendo com que a troca de idioma pareça instantânea.
fonte
Quando preciso reiniciar uma atividade, uso o seguinte código. Embora não seja recomendado.
fonte
para API antes de 11, você não pode usar recreate (). Eu resolvi desta forma:
e em onCreate ..
fonte
Depois de procurar o implemento de gingerbread para
recreate
, gostaria de usar os seguintes códigos (para gingerbread):Para esses códigos, é a partir da implementação em api superior.
Api-10 não tem requestRelaunchActivity, no entanto, a partir do diff, encontrei o seguinte:
Então, acho que poderia usar em
scheduleRelaunchActivity
vez derequestRelaunchActivity
.E eu os escrevi usando refletir:
Estou usando esses códigos para o back-porting do framework xposed.
fonte
Build.VERSION_CODES.ECLAIR_MR1
(v7). Pode funcionar em versões mais antigas também.Chame o
recreate()
método de onde você deseja recriar sua atividade. Este método irá destruir a instância atual de Activity comonDestroy()
e, em seguida, recriar a atividade comonCreate()
.fonte
Se este for o seu problema, você provavelmente deve implementar outra maneira de fazer o preenchimento da visualização em sua Atividade. Em vez de executar novamente,
onCreate()
você deve fazer com que eleonCreate()
chame seu método de preenchimento com algum argumento. Quando os dados mudam, o método de preenchimento deve ser chamado com outro argumento.fonte
A maneira como resolvi isso foi usando Fragments . Eles são compatíveis com versões anteriores até a API 4, usando a biblioteca de suporte.
Você faz um layout "wrapper" com um FrameLayout nele.
Exemplo:
Em seguida, você cria uma FragmentActivity na qual pode substituir o FrameLayout a qualquer momento.
Exemplo:
No Fragment que você aumenta / substitui, você pode usar onStart e onCreateView como normalmente usaria onCreate de uma atividade.
Exemplo:
fonte
Também dependendo da sua situação, você pode precisar em
getActivity().recreate();
vez de apenasrecreate()
.Por exemplo, você deve usá-lo se estiver fazendo
recreate()
na classe que foi criada dentro da classe de atividade.fonte
Certa vez, fiz um aplicativo de teste que carrega, exclui e depois baixa novamente o arquivo de banco de dados usando o armazenamento em nuvem do Firebase. Para exibir os dados no banco de dados, o código a seguir foi a única solução que encontrei. Nem
recreate()
nemfinish()
funcionou neste caso.fonte
Eu descobri a melhor maneira de atualizar seu Fragment quando os dados mudam
se você tem um botão "pesquisar", você deve inicializar sua lista ARRAY dentro do botão
mSearchBtn.setOnClickListener (new View.OnClickListener () {
@Override public void onClick (Ver v) {
fonte
Se você deseja passar um parâmetro para onCreate (), você deve criar um novo intent com a adição de extras e chamar StartActivity com ele. Aqui está um exemplo simples que fiz dessa forma.
fonte
Se você está apenas tentando refazer sua visualização, tive exatamente o mesmo problema. Na
onResume
função, tente colocar isto:Isso também estava no meu
onCreate()
, então colocar issoonResume
funcionou para mim :)fonte