Geri düğmesi gibi Button kullanılarak mevcut parça nasıl kapatılır?


89

Imagebutton'ı kullanarak mevcut parçayı kapatmaya çalıştım.

Ben Fragment-A'dayım ve butona tıkladığımda Fragment-B'ye döneceğim.

Ve Fragment-B'deki düğmeye tıkladığımda, Fragment-C'ye dönecek ve Fragment-B'yi kapatacak.

Fragment-C'de geri düğmesine tıklarsam, Fragment-A'ya geri dönecektir.

Denediğim kod aşağıdaki gibi

camera_album = (ImageButton) view.findViewById(R.id.camera_album);

camera_album.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {

                    closefragment();
        Fragment fragment = FileBrowserFragment.newInstance(null, null, null) ;
        MainActivity.addFragment(LocalFileBrowserFragment.this, fragment) ;


    }
});

private void closefragment() {
    getActivity().getFragmentManager().beginTransaction().remove(this).commit();
}

B parçasındaki geri düğmesine tıkladığımda, Fragment-C'ye dönüyor.

Ancak Fragment-C'deki geri düğmesine tıkladığımda, Fragment-A'ya geri dönmüyor. Boş arka plana geri dönüyor. Fragment-A'ya geri dönmek istersem, geri düğmesine bir kez daha tıklamam gerekir.

Yani, mevcut parçayı tam olarak kapatmıyor gibi görünüyor.

Android'in geri düğmesi gibi mevcut parçayı nasıl bitirebilirim?


Bu nedir MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)?? parçayı arka plana eklemek ve buna göre aynı şekilde patlatmak gerekiyor
Raghunandan

Parçayı addFragment fonksiyonuna eklediniz.
Wun

neye ve bir etkinlik yöntemine parça eklemek ??
Raghunandan

2
getActivity (). onBackPressed (); bunu yapabilir
Viswanath Lekshmanan

Yanıtlar:


82

A Parçasından B'ye gitmek için A'yı B ile değiştirin ve daha addToBackstack()önce kullanın commit().

Şimdi Parça B'den, C'ye gitmek için, ilk kullanım popBackStackImmediate(), bu A'yı geri getirecektir. Şimdi, ilk işlemde olduğu gibi A'yı C ile değiştirin.


4
usinf popStackImmediate () için: -> getView (). setOnKeyListener (new View.OnKeyListener () {@Override public boolean onKey (View v, int keyCode, KeyEvent olayı) {if (keyCode == KeyEvent.KEYCODE_BACK) {getActivity () .getSupportFragmentManager (). popBackStackImmediate (); doğru dönüş;} yanlış dönüş;}});
Yash Agrawal

134

Kodundan değiştirdim getActivity().getFragmentManager().beginTransaction().remove(this).commit();

-e

getActivity().getFragmentManager().popBackStack();

Ve parçayı kapatabilir.


36
getActivity (). onBackPressed (); Thik bu, açıkladığınız şeyi yapacak.
Viswanath Lekshmanan

5
@ suomi35 hayır. OnBackPressed () üzerinde geçersiz kılmaya ihtiyaç duyduğunuzda, böyle bir farkındalıkla ilgili sorunlarla karşılaşacaksınız
Le_Enot

Çalışmıyor gibi görünüyor. 2016'da setNavigationOnClickListener işlevi çalışmıyor.

1
@ViswanathLekshmanan Bence bu bir yorum yerine bir cevap olmalı. Ve ek olarak kabul edilen cevap.
Francisco Romero

1
Activity'i de kapatır! Yalnızca Parçanın kapatılması gerekir.
Zon

72

Basit bir yol bulması gerekenler için

Deneyin getActivity().onBackPressed();


getActivity () birçok kez boş olabilir.
Arpit J.

1
@ArpitJ. onAttach () çağrılmadan önce yalnızca boş, bir parça etkinlik olmadan yaşayamaz.
Tamim Attafi

@TamimAttafi Doğru, ancak rotasyon veya etkinlik gibi durumlara atıfta bulunuyordum ve bazı nedenlerden dolayı parça örneği hala orada o zaman boş dönecek.
Arpit J.

popBackStack()ve popBackStackImmediate()bir düğmeye basma simülasyonu olmadan en üstteki parçayı patlatmanın daha doğrudan yollarıdır. onBackPressed()Tetikleyicileri kullanma OnBackPressedCallback; Gelecekte Geri düğmesine özellikle basmak istiyorsanız , geri aramaları programlı olarak tetiklemekten kaçınmak için popBackStack()/ popBackStackImmediate()seçeneğine geçmeniz gerekir .
Nolan Amy

Bu kodu Fragment düğmelerinin onclick yöntemine koyarsınız.
Anon

6

getActivity().onBackPressedihtiyacınız olan her şeyi yapar. Üst etkinlikte otomatik olarak onBackPressed yöntemini çağırır .


5

Bu, bunu yapmanın bir Kotlin yolu, parça düzeninde buton oluşturdum ve onViewCreated'de onClickListner'ı ayarladım.

@ Viswanath-Lekshmanan yorumuna göre

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) 
{
     super.onViewCreated(view, savedInstanceState)

     btn_FragSP_back.setOnClickListener {
        activity?.onBackPressed()
    }
}

bu, parçayı değil, aktiviteyi kapatır
nibbana

4

Bunu dene:

ft.addToBackStack(null);   // ft is FragmentTransaction

Dolayısıyla, geri tuşuna bastığınızda , mevcut etkinlik (birden fazla parçayı tutan) kendisini bitirmek yerine önceki parçayı yükleyecektir.


4

Bunu dene:

public void removeFragment(Fragment fragment){
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.remove(fragment);
    fragmentTransaction.commit();
}

4

Bu mantığı deneyebilirsiniz çünkü benim için çalıştı.

frag_profile profile_fragment = new frag_profile();

boolean flag = false;
@SuppressLint("ResourceType")
public void profile_Frag(){
    if (flag == false) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.setCustomAnimations(R.anim.transition_anim0, R.anim.transition_anim1);
        transaction.replace(R.id.parentPanel, profile_fragment, "FirstFragment");
        transaction.commit();
        flag = true;
    }

}

@Override
public void onBackPressed() {
    if (flag == true) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.remove(profile_fragment);
        transaction.commit();
        flag = false;
    }
    else super.onBackPressed();
}

3
Button ok= view.findViewById(R.id.btSettingOK);
Fragment me=this;
ok.setOnClickListener( new View.OnClickListener(){
    public void onClick(View v){
     getActivity().getFragmentManager().beginTransaction().remove(me).commit();
    }
});

3
Bu kod soruyu yanıtlayabilirken, bu kodun soruyu neden ve / veya nasıl yanıtladığına ilişkin ek bağlam sağlamak, uzun vadeli değerini artırır.
rollstuhlfahrer

1
Bu basit kod aslında mevcut parça görünümünü üzerindeki Tamam veya Kapat düğmesiyle kaldırır. Parça olarak görüntülenen bir ışık ayar panelinden çıkmak ve Aktiviteye geri dönmek için kullanıyorum. Bu numara için üzgünüm ama Android 8 altında birden fazla Fragment'i yönetmenin o kadar pratik olmadığını düşünüyorum.
Bruno L.

1

Eylemi geri düğmesiyle daha belirgin bir şekilde işlemeniz gerekiyorsa, aşağıdaki yöntemi kullanabilirsiniz:

view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            onCloseFragment();
            return true;
        } else {
            return false;
        }
    }
});

0

Parçalarınızda onCreateView(...)arayarak bir görünümü kaldırabilirsiniz container.removeView(view);. Dolayısıyla, parçayı kaldırmak istiyorsanız, o zaman viewdönüş değeri olmalıdır onCreateView,

Örneğin

    public View onCreateView(...){
        final View view = inflater.inflate(R.layout.your_fragments_layout,container,false);
        //Do something
        finishButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                container.removeView(view);
            }
        });
        return view;
    }

0

2020'de ihtiyacın olursa

    Objects.requireNonNull(getActivity()).onBackPressed();

-8

Bunu dene

getActivity().finish();

1
Cevabınızı daha fazla açıklamaya çalışın, böylece OP ve diğer insanların gelecekte bu soruya geri gelecek olan cevabı anlamasını kolaylaştırmak için
Aman Chhabra

7
bu, parçayı değil tüm aktiviteyi kapatır
busuu

Bana yardımcı oldu. Daha fazla bilgi isteyenler bunu google'da arayabilir. Resmi belgeleri buraya kopyalamanıza gerek yok.
Alesha170

Genellikle bir etkinliği olan BottomNavigationView kullanıyorsanız, bu komut önceki parçaya geri dönmek yerine uygulamayı kapatacaktır.
Aliton Oliveira
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.