Botão Voltar e atualização da atividade anterior


85

Se tivermos duas atividades:

  1. Lista de arquivos e hora da última modificação
  2. Atividade de edição de arquivo

Um usuário seleciona um arquivo da lista e é levado para a atividade de edição de arquivo. Ao terminar a edição, o usuário pressiona o botão Voltar para retornar à lista de arquivos.

A lista não é recarregada e, portanto, um valor incorreto é exibido para o tempo de modificação dos arquivos recém-editados.

Qual é o método adequado para fazer com que a lista de arquivos seja atualizada após o botão Voltar ser pressionado?

Este exemplo assume que nenhum banco de dados está sendo usado, apenas um ArrayAdapter.


1
onRestart () deve funcionar melhor. onResume () será chamado duas vezes e onRestart () será chamado apenas quando você pressionar o botão Voltar.
Sarah Sakamoto

Respostas:


108

Uma opção seria usar o onResume de sua primeira atividade.

@Override
public void onResume()
    {  // After a pause OR at startup
    super.onResume();
    //Refresh your stuff here
     }

Ou você pode iniciar a Atividade para Resultado:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

Na secondActivity, se você deseja enviar dados de volta:

 Intent returnIntent = new Intent();
 returnIntent.putExtra("result",result);
 setResult(RESULT_OK,returnIntent);     
 finish();

se você não quiser retornar dados:

Intent returnIntent = new Intent();
setResult(RESULT_CANCELED, returnIntent);        
finish();

Agora, em sua classe FirstActivity, escreva o seguinte código para o onActivityResult()método

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  if (requestCode == 1) {

     if(resultCode == RESULT_OK){      
         //Update List         
     }
     if (resultCode == RESULT_CANCELED) {    
         //Do nothing?
     }
  }
}//onActivityResult

e se eu não quiser terminar a atividade atual e quiser que a atividade anterior seja atualizada
Mansuu ....

@Waza_Be onResumenão ligou para mim, alguma ideia do porquê? ( Eu tentei onRestarte onPausetambém, mas nenhum deles não ligou )
Mehdi Dehghani

No meu caso, fui para Activity from Fragment. Portanto, ao voltar de Activity para fragmentar, como outras respostas mencionam onRestart (), que não está contido em Fragment, essa resposta funcionou para mim. Para um Fragment, você pode usar onResume ().
Feroz Khan

40

Acho que onRestart () funciona melhor para isso.

@Override
public void onRestart() { 
    super.onRestart();
    //When BACK BUTTON is pressed, the activity on the stack is restarted
    //Do what you want on the refresh procedure here
}

Você pode codificar o que deseja fazer quando a Activity for reiniciada (chamada novamente a partir do evento 'botão voltar pressionado') dentro de onRestart ().

Por exemplo, se você quiser fazer a mesma coisa que faz em onCreate (), cole o código em onRestart () (por exemplo, reconstruindo a IU com os valores atualizados).


7
Isso é trivial, mas tenho que dizer: obviamente, seria melhor mover seu código onCreate () para um método separado que você então chamaria de onCreate () e de onRestart () em vez de copiar e colar.
Ricardo van den Broek

Você também pode usar onCreate () apenas para aumentar as visualizações e instanciar variáveis ​​globais e usar onStart () para atribuir / (re) defini-las. Portanto, seu init () (ou como você quiser chamá-lo) será chamado sempre que a atividade começar; ou seja, após onCreate () ou após onRestart ().
jwehrle de

Isso é muito útil se você precisa que o ViewModel de suas atividades seja reinicializado. Vamos buscar do banco de dados novamente, configurar variáveis ​​de instância ...
enorme,

34

no principal:

@Override
public void onRestart()
{
    super.onRestart();
    finish();
    startActivity(getIntent());
}

Suponho que isso vá para a atividade atual e não para a atividade anterior.
Si8

1
Eu tive o mesmo problema, exceto que o meu era um fragmento, não uma atividade. Portanto, sigo o conselho aqui e funcionou: stackoverflow.com/questions/35039512/…
David C.


2

Se você deseja atualizar a atividade anterior, esta solução deve funcionar:

Na atividade anterior em que você deseja atualizar:

@Override
public void onRestart()
{
    super.onRestart();
    // do some stuff here
}

1
private Cursor getAllFavorites() {
    return mDb.query(DocsDsctnContract.DocsDsctnEntry.Description_Table_Name,
            null,
            null,
            null,
            null,
            null,
            DocsDsctnContract.DocsDsctnEntry.COLUMN_Timest);
}
@Override
public void onResume()
{  // After a pause OR at startup
    super.onResume();
    mAdapter.swapCursor(getAllFavorites());
    mAdapter.notifyDataSetChanged();

}

public void swapCursor(Cursor newCursor){
    if (mCursor!=null) mCursor.close();
    mCursor = newCursor;
    if (newCursor != null){
        mAdapter.notifyDataSetChanged();
    }
}

Eu só tenho a categoria de favoritos, então quando eu clico no item dos favoritos aparecem essas informações e se eu não gostar - este item deve ser excluído dos Favoritos: para isso eu atualizo o banco de dados e configuro para o adaptador (para reciclagem) [Desejo a você entenderá meu problema e solução]


considere adicionar alguma explicação
Gahan

1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

Na atividade anterior, use este código. Isso fará uma transição suave e recarregará a atividade quando você voltar, pressionando o botão Voltar.


Você pode adicionar alguma descrição ao código e obrigado pela postagem.
Nelles

0

Se não estiver lidando com um retorno de chamada da atividade de edição (com onActivityResult), prefiro colocar a lógica que você mencionou em onStart (ou possivelmente em onRestart), já que tê-lo em onResume parece um exagero, visto que as mudanças só ocorrem depois onStop.

De qualquer forma, esteja familiarizado com o ciclo de vida da atividade . Além disso, observe os métodos onRestoreInstanceState e onSaveInstanceState, que não aparecem no diagrama de ciclo de vida bonito.

(Além disso, vale a pena revisar como o Tutorial do Bloco de Notas trata o que você está fazendo, embora use um banco de dados.)


0

A melhor maneira de fazer isso é usando

Intent i = new Intent(this.myActivity, SecondActivity.class); 
startActivityForResult(i, 1);

0

Tente isto

 public void refreshActivity() {
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

ou em fragmento

  public void refreshActivity() {
    Intent i = new Intent(getActivity(), MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

E adicione este método ao seu onBackPressed () como

  @Override
public void onBackPressed() {      
        refreshActivity();
        super.onBackPressed();
    }
}

É isso aí...


0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}

Esta pergunta tem alguns anos e a resposta fornecida foi marcada para revisão como uma postagem de baixa qualidade. Aqui estão algumas diretrizes para Como escrevo uma boa resposta? . Existem outras respostas que fornecem a pergunta do OP, e foram publicadas há algum tempo. Ao postar uma resposta, certifique-se de adicionar uma nova solução ou uma explicação substancialmente melhor, especialmente ao responder a perguntas mais antigas.
help-info.de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.