Menyelesaikan aktivitas saat ini dari sebuah fragmen

96

Saya memiliki fragmen dalam aktivitas yang saya gunakan sebagai panel samping navigasi. Ini berisi tombol yang ketika diklik memulai aktivitas baru (startActivity dari fragmen hanya memanggil startActivity pada aktivitas saat ini).

Untuk kehidupan saya, saya sepertinya tidak tahu bagaimana saya akan menyelesaikan aktivitas saat ini setelah memulai yang baru.

Saya ingin mencapai sesuatu seperti ini dalam fragmen:

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

Tetapi tampaknya Fragment.class tidak mengimplementasikan finish () (seperti mengimplementasikan startActivity (...)).

Saya ingin aktivitas backstack dihapus saat mereka meluncurkan aktivitas ke-2. (jadi menekan kembali dari aktivitas baru secara teknis akan menjatuhkannya kembali ke peluncur)

NPike
sumber

Jawaban:

281

Saat bekerja dengan fragmen, alih-alih menggunakan thisatau merujuk ke konteks, selalu gunakan getActivity(). Anda harus menelepon

getActivity().finish();

untuk menyelesaikan aktivitas Anda dari fragmen.

coder_For_Life22
sumber
12
getActivity()bisa nulldalam beberapa kasus. Lalu apa yang harus kita lakukan?
Matjaz Kristl
3
@ user983956 Dalam kasus seperti itu, aktivitas sudah dimusnahkan, jadi jangan panggil finish.
Cristian
2
Sebagai tip: getActivity bisa menjadi nol jika Anda mencoba menggunakannya sebelum
meluaskan
1
Aktivitas harus menjadi controller / incharge bukan fragmen, Anda sebaiknya memanggil kembali Aktivitas melalui antarmuka callback dan membiarkan Aktivitas memutuskan apakah aktivitas itu harus selesai sendiri.
Ahmed
1
Juga, jika Anda memiliki lajang yang diinjeksi dalam aktivitas tersebut, jangan lupa untuk menghancurkannya, itu akan membuat kebocoran memori, atau jika ada callback menghapusnya yaitu. , jika (getActivity ()! = null) {getActivity (). removeCallbacks (); getActivity (). destroy (); }
omersem
26

Sebenarnya ...

Saya tidak akan meminta Fragmen untuk menyelesaikan Aktivitas. Itu menempatkan terlalu banyak otoritas pada Fragmen menurut saya. Sebagai gantinya, saya akan menggunakan panduan ini di sini: http://developer.android.com/training/basics/fragments/communicating.html

Minta Fragmen untuk menentukan antarmuka yang harus diimplementasikan Aktivitas. Lakukan panggilan ke Aktivitas, lalu biarkan Aktivitas memutuskan apa yang harus dilakukan dengan informasinya. Jika aktivitas ingin selesai sendiri, maka bisa.

Jon F Hancock
sumber
2
Itu poin yang bagus, karena satu aktivitas bisa memiliki banyak fragmen. Seperti yang Anda sebutkan, cara yang disukai fragmen untuk berkomunikasi kembali ke aktivitasnya adalah melalui antarmuka.
Sasquatch
11

Seperti yang disebutkan oleh Jon F Hancock , beginilah cara fragmen dapat 'menutup' aktivitas dengan menyarankan aktivitas untuk ditutup. Ini membuat fragmen portabel seperti alasan mereka. Jika Anda menggunakannya dalam aktivitas lain, Anda mungkin tidak ingin menutup aktivitas tersebut.

Kode di bawah ini adalah cuplikan dari aktivitas dan fragmen yang memiliki tombol simpan dan batalkan.

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

PlayerInfoFragment, yang berisi antarmuka yang perlu diimplementasikan oleh aktivitas pemanggil.

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
   }
}
Sasquatch
sumber
1

Setiap kali saya menggunakan finish untuk menutup fragmen, seluruh aktivitas akan ditutup. Menurut dokumen tersebut, fragmen harus tetap ada selama aktivitas induk tetap ada.

Sebaliknya, saya menemukan bahwa saya bisa mengubah tampilan kembali aktivitas induk dengan menggunakan pernyataan ini: setContentView (R.layout.activity_main);

Ini mengembalikan saya ke aktivitas orang tua.

Saya harap ini membantu orang lain yang mungkin mencari ini.

Dave Cox
sumber
1

Sangat sederhana...

1- cukup ambil aktivitas getActivity()di dalam fragmen

2- lalu panggil finish();

Jadi hanya getActivity().finish();akan menyelesaikan aktivitas orang tua.

Ali Nawaz
sumber
1

Anda harus menggunakan metode getActivity () untuk menyelesaikan aktivitas dari fragmen.

getActivity().finish();
Madhu Jayarama
sumber
1

Dalam Fragment gunakan getActivity.finishAffinity ()

getActivity().finishAffinity();

Ini akan menghapus semua fragmen yang didorong oleh aktivitas saat ini dari Stack dengan Aktivitas juga ...

Tousif Akram
sumber
finishAffinity () akan menghapus semua aktivitas yang memiliki afinitas yang sama, sehingga aktivitas di bawah aktivitas saat ini yang berisi fragmen dalam tumpukan bisa diselesaikan juga.
Zakaria M. Jawas
0

Coba ini. Seharusnya tidak ada peringatan ...

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

15 Juni 2020 - Jawaban yang diperbarui.

Anda memiliki dua opsi untuk Java dan Kotlin. Namun, logika kedua cara itu sama. Anda harus memanggil aktivitas setelah memanggil metode finish () .

Jawaban untuk Kotlin ,

Jika aktivitas Anda tidak boleh null, gunakan Answer_1 . Namun, jika aktivitas Anda bisa nol , gunakan Answer_2 .

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

Jawaban untuk Java,

getActivity().finish();

@bayu_joo

canerkaseler.dll
sumber
-1

coba gunakan ini

ya Fragment.classtidak diimplementasikanfinish()

Saat bekerja dengan fragmen, alih-alih menggunakan ini atau mengacu pada konteks, selalu gunakan getActivity(). Anda harus menelepon

Rahul Goswami
sumber
11
Beri tahu saya perbedaan antara jawaban Anda dan jawaban pertama di atas (oleh @ coder_For_Life22) ...
Filipe Brito
dont its a trap
Demotivasi