Pertanyaan Bagaimana cara mengganti fragmen C dengan fragmen A ketika tombol kembali ditekan?


Skenario saya: Kegiatan 1 terdiri dari Fragmen A-> B-> C. Semua fragmen ditambahkan menggunakan kode ini:

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.content, fragment, TAG);
        ft.addToBackStack(TAG);
        ft.commit();

Sekarang, dari fragmen C, saya ingin langsung kembali ke Fragmen A. Karena itu, saya sudah berkomentar ft.addToBackStack(TAG) sambil menambahkan Fragment C. Jadi ketika saya menekan tombol kembali dari C saya langsung mendapat Fragment A di layar.

Namun, Fragmen C tidak digantikan oleh A. Bahkan, kedua fragmen tersebut terlihat. Bagaimana saya mengatasi masalah ini?


32
2017-12-21 05:44


asal


Jawaban:


Teori

Menggunakan addToBackStack(tag:String):FragmentTransaction metode dari dalam FragmentTransaction untuk menandai titik di mana Anda ingin kembali. Metode ini mengembalikan FragmentTransaction contoh untuk hanya kemampuan rantai.

Lalu Kembalikan dengan popBackStackImmediate(tag:String,flag:int):void metode dari FragmentManager. Tag adalah apa yang Anda tentukan sebelumnya. Bendera adalah konstanta POP_BACK_STACK_INCLUSIVE untuk memasukkan transaksi yang ditandai atau 0.

Contoh

Apa yang berikut adalah contoh dengan tata letak berikut memiliki FrameLayout dengan id content_frame di mana fragmen dimasukkan ke dalamnya.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_below="@id/textView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</RelativeLayout>

Kode di bawah menandai fragmen oleh nama kelas fragmen saat mengganti konten elemen tata letak dengan id content_frame.

public void loadFragment(final Fragment fragment) {

    // create a transaction for transition here
    final FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction();

    // put the fragment in place
    transaction.replace(R.id.content_frame, fragment);

    // this is the part that will cause a fragment to be added to backstack,
    // this way we can return to it at any time using this tag
    transaction.addToBackStack(fragment.getClass().getName());

    transaction.commit();
}

Dan untuk melengkapi contoh ini, sebuah metode yang memungkinkan Anda untuk kembali ke fragmen yang sama persis menggunakan tag saat Anda mengisinya.

public void backToFragment(final Fragment fragment) {

    // go back to something that was added to the backstack
    getSupportFragmentManager().popBackStackImmediate(
            fragment.getClass().getName(), 0);
    // use 0 or the below constant as flag parameter
    // FragmentManager.POP_BACK_STACK_INCLUSIVE);

}

Ketika mengimplementasikan ini nyata Anda mungkin ingin menambahkan cek null pada parameter fragmen ;-).


17
2017-09-27 15:51



Anda perlu melakukan 2 hal - beri nama FragmentTransaction dari A-> B dan kemudian timpa padaBackPressed () dalam aktivitas Anda yang berisi untuk memanggil FragmentManager # popBackStack (Nama string, bendera int) ketika Anda berada di Fragmen C. Contoh:

Transisi dari A-> B

getSupportFragmentManager()
  .beginTransaction()
  .replace(R.id.container, new FragmentB(), "FragmentB")
  .addToBackStack("A_B_TAG")
  .commit();

Transisi dari B-> C akan menggunakan transaksi serupa dengan "FragmentC" sebagai tagnya.

Kemudian dalam Kegiatan Anda yang meng-override onBackPressed ():

@Override
public void onBackPressed() {
  if (getSupportFragmentManager().findFragmentByTag("FragmentC") != null) {
    // I'm viewing Fragment C
    getSupportFragmentManager().popBackStack("A_B_TAG",
      FragmentManager.POP_BACK_STACK_INCLUSIVE);
  } else {
    super.onBackPressed();
  }
}

26
2018-02-05 18:18



  Button apply=(Button)view.findViewById(R.id.apply);

                apply.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        FragmentManager fm=activity.getSupportFragmentManager();
                        Fragment f = new QuickRegistration();
                        FragmentTransaction ft= fm.beginTransaction();
                        ft.addToBackStack(null);
                        ft.replace(R.id.mainframe,f);
                        ft.commit();




                    }
                });

gunakan impor

import android.support.v4.app.FragmentManager;
import android.content.Context;
import android.support.v4.app.Fragment;


import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.FragmentActivity;

0
2017-07-01 05:53