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.

Paulo
fonte
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
Waza_Be
fonte
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).

Sarah Sakamoto
fonte
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());
}
Hamze Shoae
fonte
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.
8

Eu recomendaria substituir o onResume()método na atividade número 1 e incluir código para atualizar seu adaptador de array, isso é feito usando[yourListViewAdapater].notifyDataSetChanged();

Leia isto se tiver problemas para atualizar a lista: Atualização da visualização de lista do Android

blindstuff
fonte
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
}
Tô Minh Tiến
fonte
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]

Aizhan Nessipbayeva
fonte
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.

Robiul Hossain Shah Imran
fonte
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.)

Thane Anthem
fonte
0

A melhor maneira de fazer isso é usando

Intent i = new Intent(this.myActivity, SecondActivity.class); 
startActivityForResult(i, 1);
Flavio Candido
fonte
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í...

Rahul
fonte
0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}
Syed Zaidi
fonte
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