Geri düğmesi ve önceki etkinliği yenileme


85

İki etkinliğimiz varsa:

  1. Dosyaların listesi ve son değiştirilme zamanı
  2. Dosya düzenleme etkinliği

Kullanıcı, listeden bir dosya seçer ve dosya düzenleme etkinliğine götürülür. Düzenleme bittiğinde, kullanıcı dosya listesine dönmek için geri düğmesine basar.

Liste yeniden yüklenmez ve bu nedenle, yeni düzenlenen dosyaların değiştirilme zamanı için yanlış bir değer görüntülenir.

Geri düğmesine basıldıktan sonra dosya listesinin yenilenmesini sağlamanın doğru yöntemi nedir?

Bu örnek, hiçbir veritabanının kullanılmadığını, yalnızca bir ArrayAdapter kullanıldığını varsayar.


1
onRestart () daha iyi çalışmalıdır. onResume () iki kez çağrılacak ve onRestart () yalnızca geri düğmesine bastığınızda çağrılacaktır.
Sarah Sakamoto

Yanıtlar:


108

Bir seçenek, ilk etkinliğinizin onResume'unu kullanmak olabilir.

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

Veya Sonuç için Aktivite başlatabilirsiniz:

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

SecondActivity'de verileri geri göndermek istiyorsanız:

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

veri döndürmek istemiyorsanız:

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

Şimdi FirstActivity sınıfınızda onActivityResult()yöntem için aşağıdaki kodu yazın

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

ya mevcut aktiviteyi bitirmek istemiyorsam ve önceki aktivitenin güncellenmesini istiyorsam
Mansuu ....

@Waza_Benim onResumeiçin aranmadı , herhangi bir fikrin neden? ( Denedim onRestartve onPauseçok ama bunların hiçbiri aramadı )
Mehdi Dehghani

Benim durumumda, Fragment'tan Aktiviteye gittim. Yani Activity'den parçaya geri döndüğümde, diğer yanıtlar onRestart () Fragment tarafından kapsanmayan onRestart () 'dan bahsederken, Yani bu cevap benim için çalıştı. Bir Parça için onResume () kullanabilirsiniz.
Feroz Khan

40

Sanırım onRestart () bunun için daha iyi çalışıyor.

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

Etkinlik yeniden başlatıldığında ('geri düğmesine basıldığında' olaydan tekrar çağrılır) yapmak istediğiniz şeyi onRestart () içinde kodlayabilirsiniz.

Örneğin, onCreate () içinde yaptığınız şeyi yapmak istiyorsanız, kodu onRestart () içine yapıştırın (örneğin, kullanıcı arayüzünü güncellenmiş değerlerle yeniden oluşturmak).


7
Bu önemsiz, ama var bunu söylemek: belli ki daha sonra ikisi de onCreate () yanı sıra onRestart () yerine kopyasından yapıştırarak çağırmak o ayrı bir yöntemle içine onCreate () kodu taşımak için daha iyi olurdu.
Ricardo van den Broek

Ayrıca onCreate () öğesini yalnızca görünümleri şişirmek ve global değişkenleri somutlaştırmak için kullanabilir ve bunları atamak / (yeniden) ayarlamak için onStart () öğesini kullanabilirsiniz. Böylece, init () iniz (veya ne demek isterseniz) etkinlik her başladığında çağrılacaktır; yani onCreate () veya onRestart () sonrasında.
jwehrle

Aktivitelerinizin ViewModel'ının yeniden başlatılmasına ihtiyacınız varsa, bu gerçekten yararlıdır. Veritabanından tekrar
almasına izin veriyor

34

esas olarak:

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

Bunun önceki aktiviteye değil mevcut aktiviteye gittiğini tahmin ediyorum?
Si8

1
Ben de aynı sorunu yaşadım, ancak benimki bir Parça değil Etkinlik. Bu nedenle, buradaki tavsiyelere uyuyorum ve işe yaradı: stackoverflow.com/questions/35039512/…
David C.

8

onResume()1 numaralı etkinlikteki yöntemi geçersiz kılmanızı öneririm ve burada dizi bağdaştırıcınızı yenilemek için kod ekleyin, bu şu şekilde yapılır:[yourListViewAdapater].notifyDataSetChanged();

Listeyi yenilemekte sorun yaşıyorsanız bunu okuyun: Android Liste görünümü yenileme


2

Önceki etkinliği yenilemek istiyorsanız, bu çözüm çalışmalıdır:

Yenilemek istediğiniz önceki aktivitede:

@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();
    }
}

Sadece favoriler kategorim var, bu yüzden favorilerden öğeye tıkladığımda bu tür bilgiler görünüyor ve beğenmezsem - bu öğe Sık Kullanılanlardan silinmeli: bunun için veritabanını yenilerim ve adaptöre ayarlıyorum (geri dönüşüm için) [Keşke sorunumu ve çözümümü anlayacağım]


biraz açıklama eklemeyi düşünün
Gahan

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

Önceki aktivitede bu kodu kullanın. Bu, yumuşak bir geçiş yapacak ve geri düğmesine basarak geri döndüğünüzde etkinliği yeniden yükleyecektir.


Koda bir açıklama ekleyip gönderi için teşekkür eder misiniz?
Nelles

0

Düzenleme etkinliğinden (onActivityResult ile) bir geri aramayı ele almıyorsanız, onStart'ta (veya muhtemelen onRestart'ta) bahsettiğiniz mantığı koymayı tercih ederim, çünkü onResume'da değişikliklerin yalnızca daha sonra gerçekleştiği göz önüne alındığında, aşırılık gibi görünüyor. onStop.

Her halükarda , Etkinlik yaşam döngüsüne aşina olun . Ayrıca, güzel yaşam döngüsü diyagramında görünmeyen onRestoreInstanceState ve onSaveInstanceState yöntemlerini not edin.

(Ayrıca, bir veritabanı kullanmasına rağmen Not Defteri Eğitiminin yaptığınız şeyi nasıl ele aldığını incelemeye değer .)


0

Düşünmenin en iyi yolu kullanmaktır

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

0

Bunu dene

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

}

veya Fragman halinde

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

}

Ve bu yöntemi onBackPressed () beğeninize ekleyin

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

Bu kadar...


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

Bu soru birkaç yıl öncesine ait ve sağlanan yanıt, Düşük Kaliteli Gönderi olarak incelenmek üzere işaretlendi. İşte nasıl iyi bir cevap yazabilirim? . OP'nin sorusunu sağlayan başka cevaplar da var ve bunlar bir süre önce yayınlandı. Bir yanıt gönderirken, lütfen özellikle eski soruları yanıtlarken yeni bir çözüm veya çok daha iyi bir açıklama eklediğinizden emin olun.
help-info.de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.