Przycisk Wstecz i odświeżanie poprzedniej czynności

84

Jeśli mamy dwa działania:

  1. Lista plików i czas ostatniej modyfikacji
  2. Czynności związane z edycją plików

Użytkownik wybiera plik z listy i zostaje przeniesiony do czynności edycji pliku. Po zakończeniu edycji użytkownik naciska przycisk Wstecz, aby powrócić do listy plików.

Lista nie jest ładowana ponownie i dlatego wyświetlana jest niepoprawna wartość czasu modyfikacji właśnie edytowanych plików.

Jaka jest właściwa metoda spowodowania odświeżenia listy plików po naciśnięciu przycisku Wstecz?

W tym przykładzie przyjęto założenie, że nie jest używana żadna baza danych, tylko ArrayAdapter.

Paweł
źródło
1
onRestart () powinien działać lepiej. onResume () zostanie wywołany dwukrotnie, a onRestart () zostanie wywołany tylko wtedy, gdy naciśniesz przycisk Wstecz.
Sarah Sakamoto,

Odpowiedzi:

108

Jedną z opcji byłoby skorzystanie z funkcji onResume pierwszej aktywności.

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

Możesz też rozpocząć działanie dla wyniku:

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

W secondActivity jeśli chcesz odesłać dane:

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

jeśli nie chcesz zwracać danych:

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

Teraz w swojej klasie FirstActivity napisz następujący kod onActivityResult()metody

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
źródło
co, jeśli nie chcę kończyć bieżącej działalności i chcę, aby poprzednie działanie zostało zaktualizowane
Mansuu ....
@Waza_Be onResumenie wzywał mnie, jakiś pomysł dlaczego? ( Próbowałem onRestarti onPauseteż, ale żaden z nich nie nazywa )
Mehdi Dehghani
W moim przypadku przeszedłem do Activity from Fragment. Więc wracając z Activity do fragmentu, ponieważ inne odpowiedzi wspominają o onRestart (), który nie jest zawarty przez Fragment, więc ta odpowiedź zadziałała dla mnie. W przypadku fragmentu możesz użyć onResume ().
Feroz Khan
39

Myślę, że onRestart () działa lepiej w tym przypadku.

@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
}

Możesz zakodować, co chcesz zrobić, gdy działanie zostanie ponownie uruchomione (wywołane ponownie ze zdarzenia „naciśnięto przycisk wstecz”) w onRestart ().

Na przykład, jeśli chcesz zrobić to samo, co robisz w onCreate (), wklej kod w onRestart () (np. Rekonstruując interfejs użytkownika ze zaktualizowanymi wartościami).

Sarah Sakamoto
źródło
7
To banalne, ale ja mam to powiedzieć: oczywiście, że byłoby lepiej, aby przenieść onCreate () kod do osobnej metody, które następnie invoke zarówno onCreate (), a także onRestart () zamiast kopii wklejając go.
Ricardo van den Broek
Możesz także użyć onCreate () tylko do zawyżania widoków i tworzenia instancji zmiennych globalnych oraz używania onStart () do przypisywania / (ponownego) ustawiania. Zatem twoja init () (lub jakkolwiek chcesz to nazwać) zostanie wywołana za każdym razem, gdy aktywność się rozpocznie; tj. po onCreate () lub po onRestart ().
jwehrle
Jest to naprawdę przydatne, jeśli chcesz ponownie zainicjować model widoku działań. Pozwala ponownie pobrać dane z bazy danych, ustawić zmienne instancji ...
ogromne,
34

w zasadzie:

@Override
public void onRestart()
{
    super.onRestart();
    finish();
    startActivity(getIntent());
}
hamze shoae
źródło
Zgaduję, że chodzi o bieżącą aktywność, a nie o poprzednią?
Si8
1
Miałem ten sam problem, ale moim był fragment, a nie działanie. Dlatego postępuję zgodnie z radą tutaj i zadziałało: stackoverflow.com/questions/35039512/…
David C.
8

Zalecałbym nadpisanie onResume()metody w działaniu numer 1 i dołączenie kodu odświeżającego adapter tablicy, odbywa się to za pomocą[yourListViewAdapater].notifyDataSetChanged();

Przeczytaj, jeśli masz problem z odświeżeniem listy: Odśwież widok listy Androida

ślepy
źródło
2

Jeśli chcesz odświeżyć poprzednią aktywność, to rozwiązanie powinno działać:

W poprzedniej czynności, w której chcesz odświeżyć:

@Override
public void onRestart()
{
    super.onRestart();
    // do some stuff here
}
Tô Minh Tiến
źródło
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();
    }
}

Mam tylko kategorię ulubionych, więc po kliknięciu pozycji z ulubionych pojawiają się takie informacje i jeśli mi się nie podoba - ta pozycja powinna zostać usunięta z Ulubionych: w tym celu odświeżam bazę danych i ustawiam ją na adapter (do recyklingu) [Życzę zrozumie mój problem i rozwiązanie]

Aizhan Nessipbayeva
źródło
rozważ dodanie wyjaśnienia
Gahan,
1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

W poprzednim ćwiczeniu użyj tego kodu. Spowoduje to płynne przejście i ponowne załadowanie czynności, gdy wrócisz, naciskając przycisk Wstecz.

Robiul Hossain Shah Imran
źródło
Czy możesz dodać opis do kodu i podziękować za post.
Nelles
0

Jeśli nie obsługujesz wywołania zwrotnego z czynności edycyjnej (z onActivityResult), wolałbym raczej umieścić logikę, o której wspomniałeś w onStart (lub prawdopodobnie w onRestart), ponieważ posiadanie go w onResume wydaje się po prostu przesadą, biorąc pod uwagę, że zmiany następują dopiero po onStop.

W każdym razie zapoznaj się z cyklem życia działania . Ponadto zwróć uwagę na metody onRestoreInstanceState i onSaveInstanceState, które nie pojawiają się na ładnym diagramie cyklu życia.

(Warto również sprawdzić, jak samouczek Notatnika obsługuje to, co robisz, chociaż korzysta z bazy danych).

Thane Anthem
źródło
0

Najlepszym sposobem na to jest użycie

Intent i = new Intent(this.myActivity, SecondActivity.class); 
startActivityForResult(i, 1);
Flavio Candido
źródło
0

Spróbuj tego

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

}

lub we fragmentach

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

}

I dodaj tę metodę do swojego onBackPressed () jak

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

Otóż ​​to...

Rahul
źródło
0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}
Syed Zaidi
źródło
To pytanie ma już kilka lat, a udzielona odpowiedź została oznaczona do sprawdzenia jako post niskiej jakości. Oto kilka wskazówek, jak napisać dobrą odpowiedź? . Istnieją inne odpowiedzi, które zawierają pytanie PO, i zostały one opublikowane jakiś czas temu. Pisząc odpowiedź, upewnij się, że dodałeś nowe rozwiązanie lub znacznie lepsze wyjaśnienie, szczególnie w przypadku odpowiedzi na starsze pytania.
help-info.de