Mengganti fragmen dengan fragmen lain di dalam grup aktivitas

137

Saya memiliki fragmen di dalam aktivitas grup dan saya ingin menggantinya dengan fragmen lain:

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
SectionDescriptionFragment bdf = new SectionDescriptionFragment();
ft.replace(R.id.book_description_fragment, bdf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

Ini berfungsi dengan baik ketika dilakukan sebagai proyek terpisah tanpa menggunakan grup aktivitas, semuanya berfungsi dengan baik di log cat saat kontrol masuk ke dalam getview (), tetapi tidak ada tampilan yang terlihat, bahkan tidak ada pengecualian yang muncul, saya ingin fragmen detail buku ke diganti dengan fragmen detail bagian.

Xml fragmen detail buku memiliki id book_description_fragment dan xml untuk fragmen deskripsi bagian memiliki id section_description_fragment.

Kode di atas ada dalam metode onClick suatu item, saya ingin ketika pengguna mengetuk item dalam tampilan gulir horizontal, maka fragmennya berubah.

Lion Heart
sumber

Jawaban:

253

Fragmen yang memiliki kode keras dalam XML, tidak dapat diganti. Jika Anda perlu mengganti fragmen dengan yang lain, Anda harus menambahkannya secara dinamis, pertama-tama.

Catatan: R.id.fragment_container adalah layout atau container pilihan Anda dalam aktivitas tempat Anda membawa fragmen.

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();
Subin Sebastian
sumber
8
apa R.id.fragment_container dalam kasus ini?
Guy
4
@Guy, Ini bisa berupa tata letak apa pun yang Anda inginkan untuk memuat fragmen.
Subin Sebastian
1
apa yang seharusnya menjadi nama fragmen dalam file xml? Saya ingin menambahkan fragmen secara dinamis dan tidak ingin ada fragmen statis.
Rajat Mehra
1
@RajatMehra Jika Anda ingin menambahkan fragmen secara dinamis, Anda tidak perlu menentukan fragmen di dalam XML sama sekali. Anda dapat menggunakan tampilan kontainer. Mohon dibaca kembali jawabannya.
Subin Sebastian
4
@Ahmed Alasannya adalah, berdasarkan arsitektur, sistem mengganti setiap tag <fragment> dengan tampilan (grup) yang disediakan oleh fragmen terkait ' onCreateView(). Jadi, seperti yang bisa Anda asumsikan, setiap referensi ke fragmen sebenarnya hilang di tingkat tampilan. Jadi, pada dasarnya Anda tidak dapat mengganti fragmen, tetapi Anda dapat secara manual menghapus tampilan yang sekarang ada di container dan meletakkan fragmen di sana jika diperlukan.
Subin Sebastian
35

Silakan lihat Pertanyaan ini

Anda hanya dapat mengganti " fragmen yang ditambahkan secara dinamis ".

Jadi, jika Anda ingin menambahkan fragmen dinamis, lihat contoh ini .

Sana
sumber
1
Hai. Saya sudah menemukan solusinya, sebenarnya saya tidak menempatkan isi dari fragmen dalam sebuah layout, melainkan saya menggunakan fragmen lain untuk isi dari fragmen sebelumnya
Lion Heart
Tidak, di sini saya ingin mengganti seluruh fragmen dengan fragmen baru.
Sana
1
@Lion Heart, Bisakah Anda menjelaskan solusi yang Anda temukan?
Namratha
Tautannya
8

Saya telah membuat intisari dengan metode yang sempurna untuk mengelola penggantian fragmen dan siklus hidup .

Ini hanya mengganti fragmen saat ini dengan yang baru, jika tidak sama dan jika tidak di backstack (dalam hal ini akan meletuskannya).

Ini berisi beberapa opsi seolah-olah Anda ingin fragmen disimpan di backstack.

=> Lihat Intinya di sini

Menggunakan ini dan satu Aktivitas, Anda mungkin ingin menambahkan ini ke aktivitas Anda:

@Override
public void onBackPressed() {
    int fragments = getSupportFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
            finish();
            return;
    }

    super.onBackPressed();
}
Hugo Gresse
sumber
1
@ RémiP tautan berfungsi seperti yang diharapkan. Anda dapat memeriksa yang ini yang mungkin lebih baik IMO github.com/HugoGresse/Anecdote/blob/master/app/src/main/java/io/…
Hugo Gresse
7

Gunakan kode di bawah ini di android.support.v4

FragmentTransaction ft1 = getFragmentManager().beginTransaction();
WebViewFragment w1 = new WebViewFragment();
w1.init(linkData.getLink());
ft1.addToBackStack(linkData.getName());
ft1.replace(R.id.listFragment, w1);
ft1.commit();
Sachin Suthar
sumber
4

Gunakan kode ini menggunakan v4

 ExampleFragment newFragment = new ExampleFragment();     
 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  
 // Replace whatever is in the fragment_container view with this fragment,  
 // and add the transaction to the back stack so the user can navigate back   
 transaction.replace(R.id.container, newFragment);
 transaction.addToBackStack(null);  
 // Commit the transaction   
 transaction.commit();
Manish Butola
sumber
3

Gunakan ViewPager. Ini bekerja untuk saya.

final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.vp_pager); 
button = (Button)result.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewPager.setCurrentItem(1);
    }
});
Nikolay
sumber
2

harap Anda baik-baik saja. ketika saya mulai bekerja dengan Android Fragmentsitu saya juga mengalami masalah yang sama kemudian saya membaca tentang 1- Cara mengganti fragmen dengan yang lain. 2- Bagaimana menambahkan fragmen ifFragment container tidak memiliki fragmen.

kemudian setelah beberapa R&D, saya membuat fungsi yang membantu saya dalam banyak Proyek sampai sekarang dan saya masih menggunakan fungsi sederhana ini.

public void switchFragment(BaseFragment baseFragment) {
    try {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
        if (getSupportFragmentManager().findFragmentById(R.id.home_frame) == null) {
            ft.add(R.id.home_frame, baseFragment);
        } else {
            ft.replace(R.id.home_frame, baseFragment);
        }
        ft.addToBackStack(null);
        ft.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

nikmati waktu kode Anda :)

John Smith
sumber
Mengapa Anda harus membungkus kode transaksi fragmen Anda di dalam try catch dengan pengecualian umum?
Pisang droid
1

Anda Dapat Menggunakan Kode Ini

((AppCompatActivity) getActivity()).getSupportFragmentManager().beginTransaction().replace(R.id.YourFrameLayout, new YourFragment()).commit();

atau Anda Dapat Menggunakan Kode Ini

YourFragment fragments=(YourFragment) getSupportFragmentManager().findFragmentById(R.id.FrameLayout);

        if (fragments==null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.FrameLayout, new Fragment_News()).commit();
        }
Diako Hasani
sumber
0

Di kotlin Anda dapat melakukan:

// instantiate the new fragment
val fragment: Fragment = ExampleFragment()

val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.book_description_fragment, fragment)
transaction.addToBackStack("transaction_name")
// Commit the transaction
transaction.commit()
Nicola Gallazzi
sumber
0

Anda dapat menggunakan kode sederhana yang berfungsi untuk transaksi

Fragment newFragment = new MainCategoryFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame_NavButtom, newFragment);
ft.commit(); 
Nicola Gallazzi
sumber
0

Saya mengubah fragmen secara dinamis dalam kode baris tunggal.
Ini berfungsi di semua versi SDK dan androidx
saya menggunakan navigasi sebagaiBottomNavigationView

    BottomNavigationView btn_nav;
    FragmentFirst fragmentFirst;
    FragmentSecond fragmentSecond;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        fragmentFirst = new FragmentFirst();
        fragmentSecond = new FragmentSecond ();
        changeFragment(fragmentFirst); // at first time load the fragmentFirst
        btn_nav = findViewById(R.id.bottomNav);
        btn_nav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                switch(menuItem.getItemId()){
                    case R.id.menu_first_frag:
                        changeFragment(fragmentFirst); // change fragmentFirst
                        break;
                    case R.id.menu_second_frag:
                        changeFragment(fragmentSecond); // change fragmentSecond
                        break;
                        default:
                            Toast.makeText(SearchActivity.this, "Click on wrong bottom SORRY!", Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        });
    }
public void changeFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout_changer, fragment).commit();
    }
Safari Mahdi
sumber
0

Ini akan berfungsi jika Anda mencoba mengubah fragmen dari fragmen lain.

Objects.requireNonNull(getActivity()).getSupportFragmentManager()
.beginTransaction()
.replace(R.id.home_fragment_container,new NewFragment())

CATATAN Seperti yang dinyatakan dalam jawaban di atas, Anda harus memiliki fragmen dinamis.

emkarachchi
sumber