Bir parçadan mevcut aktiviteyi bitirmek


98

Gezinme çekmecesi olarak kullandığım bir etkinlikte bir parçam var. Tıklandığında yeni aktiviteler başlatan düğmeler içerir (bir parçadan startActivity sadece mevcut aktivitede startActivity'yi çağırır).

Hayatım boyunca, yeni bir aktiviteye başladıktan sonra mevcut aktiviteyi nasıl bitireceğimi anlayamıyorum.

Parçada şöyle bir şey başarmaya çalışıyorum:

@Override
public void onClick(View view) {
    // TODO Auto-generated method stub
    if (view == mButtonShows) {
        Intent intent = new Intent(view.getContext(), MyNewActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        finish();
    } 
}

Ancak Fragment.class'ın finish () 'yi uygulamadığı görülüyor (startActivity (...) gibi).

2. aktiviteyi başlattıklarında backstack aktivitesinin temizlenmesini istiyorum. (bu nedenle yeni aktiviteden geri basmak, onları teknik olarak başlatıcıya geri döndürür)

Yanıtlar:


284

Parçalarla çalışırken this, bağlama başvurmak veya bağlam kullanmak yerine daima kullanın getActivity(). Aramalısın

getActivity().finish();

aktivitenizi parçadan bitirmek için.


12
getActivity()olabilir nullbazı durumlarda. O halde ne yapmalıyız?
Matjaz Kristl

3
@ user983956 Bu gibi durumlarda aktivite zaten yok edilmiştir, bu yüzden aramayın finish.
Cristian

2
Bir ipucu olarak: görünümü şişirmeden önce kullanmaya çalışırsanız getActivity boş olabilir
csanonymus

1
Etkinlik, parça değil, denetleyici / genişleme olmalıdır, daha ziyade bir geri arama arabirimi aracılığıyla Etkinliği geri çağırmalı ve Faaliyetin kendi kendini bitirip bitirmemesine karar vermesine izin vermelisiniz.
Ahmed

1
Ayrıca, aktiviteye enjekte edilmiş singletonlarınız varsa, onları yok etmeyi unutmayın, hafıza sızıntıları yaratır veya geri çağırmalar varsa onları kaldırın yani. , eğer (getActivity ()! = null) {getActivity (). removeCallbacks (); getActivity (). destroy (); }
omersem

26

Aslında ...

Parçanın Aktiviteyi bitirmeye çalışmasını istemezdim. Bu, bence Fragman'a çok fazla yetki veriyor. Bunun yerine, buradaki kılavuzu kullanırdım: http://developer.android.com/training/basics/fragments/communicating.html

Parçanın, Aktivitenin uygulaması gereken bir arayüz tanımlamasını sağlayın. Aktiviteye bir çağrı yapın, ardından Aktivitenin bilgilerle ne yapılacağına karar vermesine izin verin. Aktivite kendini bitirmek istiyorsa, yapabilir.


2
Bu iyi bir nokta çünkü tek bir aktivitede birden fazla parça mevcut olabilir. Bahsettiğiniz gibi, bir parçanın aktivitesine geri dönmesi için tercih edilen yol bir arayüz yoluyladır.
Sasquatch

11

Jon F Hancock'un bahsettiği gibi , bu, bir parçanın, aktivitenin kapanmasını önererek faaliyeti nasıl 'kapatabileceğini' gösterir. Bu, nedeni olduğu gibi parçayı taşınabilir hale getirir. Farklı bir aktivitede kullanırsanız, aktiviteyi kapatmak istemeyebilirsiniz.

Aşağıdaki kod, kaydet ve iptal et düğmesi olan bir etkinlik ve parçadan bir parçacıktır.

PlayerActivity

public class PlayerActivity extends Activity 
    implements PlayerInfo.PlayerAddListener {

    public void onPlayerCancel() {
       // Decide if its suitable to close the activity, 
       //e.g. is an edit being done in one of the other fragments?
       finish();
    }
}

Çağıran etkinliğin uygulaması gereken bir arabirim içeren PlayerInfoFragment.

public class PlayerInfoFragment extends Fragment {
   private PlayerAddListener callback; // implemented in the Activity

   @Override
   public void onAttach(Activity activity) {
     super.onAttach(activity);
     callback= (PlayerAddListener) activity;
   }

   public interface PlayerAddListener {
       public void onPlayerSave(Player p); // not shown in impl above
       public void onPlayerCancel();
   }

   public void btnCancel(View v) {
      callback.onPlayerCancel(); // the activity's implementation
   }
}

2

Etkinliği parçadan bitirmek için getActivity () yöntemini kullanmalısınız.

getActivity().finish();

1

Parçayı kapatmak için bitir'i her kullandığımda, tüm etkinlik kapanıyor. Dokümanlara göre, parçalar ana faaliyet kaldığı sürece kalmalıdır.

Bunun yerine, şu ifadeyi kullanarak ana etkinliğin görünümlerini geri değiştirebileceğimi buldum: setContentView (R.layout.activity_main);

Bu beni ana faaliyete geri döndürüyor.

Umarım bu, bunu arayan başka birine yardımcı olur.


1

Çok basit...

1- sadece kepçe aktivitesi getActivity()fragmanında

2- sonra ara finish();

Yani sadece getActivity().finish();ebeveyn aktivitesini bitirecek.


1

Fragment'te getActivity.finishAffinity () kullanın

getActivity().finishAffinity();

Mevcut aktivite tarafından itilen tüm parçaları da Aktivite ile Yığından kaldıracaktır ...


finishAffinity (), aynı yakınlığa sahip tüm etkinlikleri kaldıracaktır, böylece yığındaki parçayı içeren mevcut etkinliğin altındaki etkinlikler de bitirilebilir.
Zakaria M. Jawas

0

Bunu dene. Herhangi bir uyarı olmamalı ...

            Activity thisActivity = getActivity();
            if (thisActivity != null) {
                startActivity(new Intent(thisActivity, yourActivity.class)); // if needed
                thisActivity.finish();
            }

0

15 Haziran 2020 - Yanıt güncellendi.

Java ve Kotlin için iki seçeneğiniz var. Bununla birlikte, her iki yolun mantığı aynıdır. Sen çağırmalıdır etkinliğini çağrı sonrasında bitiş () yöntemiyle.

Kotlin için cevap ,

Aktiviteniz boş olamazsa , Answer_1'i kullanın . Ancak, etkinliğiniz boş olabilirse , Answer_2'yi kullanın .

Answer_1: activity!!.finish()
Answer_2: activity?.finish()

Java için cevap,

getActivity().finish();

@canerkaseler


0

Bu, iddia gerektirmez, android JetPack'te parçadaki son güncelleme

requireActivity().finish();

-1

bunu kullanmayı dene

evet Fragment.classuygulamıyorfinish()

Parçalarla çalışırken, bunu kullanmak veya içeriğe atıfta bulunmak yerine her zaman kullanın getActivity(). Aramalısın


11
Cevabınız ile yukarıdaki ilk cevap arasındaki farkı anlatın (@ coder_For_Life22) ...
Filipe Brito

dont its a trap
Demotivated
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.