बैक बटन जैसे बटन का उपयोग करके वर्तमान टुकड़े को कैसे बंद करें?


85

मैंने Imagebutton का उपयोग करके वर्तमान टुकड़े को बंद करने का प्रयास किया है।

मैं Fragment-A में हूं और बटन क्लिक करने पर यह Fragment-B की ओर मुड़ जाएगा।

और जब मैं Fragment-B पर बटन क्लिक करता हूं, तो यह Fragment-C की ओर मुड़ जाएगा और Fragment-B को बंद कर देगा।

अगर मैं Fragment-C पर बैक बटन पर क्लिक करता हूं, तो यह Fragment-A पर वापस आ जाएगा।

मेरे पास जो कोड है, वह निम्न की तरह है

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

जब मैं खंड-बी पर बैक बटन पर क्लिक करता हूं, तो यह फ्रैगमेंट-सी की ओर मुड़ जाता है।

लेकिन जब मैं फ्रैगमेंट-सी पर बैक बटन पर क्लिक करता हूं, तो यह फ्रैगमेंट-ए पर वापस नहीं आता है। यह खाली पृष्ठभूमि पर वापस आ गया है। अगर मुझे फ्रैगमेंट-ए पर वापस जाना है, तो मुझे एक बार फिर से बैक बटन पर क्लिक करना होगा।

इसलिए, ऐसा लगता है कि वर्तमान खंड पूर्ण को बंद नहीं करता है।

एंड्रॉइड के बैक बटन की तरह वर्तमान टुकड़ा कैसे खत्म करें?


ये क्या है MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)?? आपको बैकस्टॉक में टुकड़ा जोड़ने की जरूरत है और उसी के अनुसार पॉप करें
रघुनंदन

समारोह addFragment में टुकड़ा जोड़ा गया है।
वुन

क्या और एक गतिविधि विधि के लिए टुकड़ा जोड़ें ??
रघुनंदन

2
getActivity () onBackPressed ()।; यह कर सकते हैं
विश्वनाथ लीक्षमन

जवाबों:


82

फ्रैगमेंट ए से, बी तक जाने के लिए, ए को बी के साथ बदलें और addToBackstack()पहले का उपयोग करें commit()

अब फ्रैगमेंट बी से, सी में जाने के लिए, पहले उपयोग करें popBackStackImmediate(), यह ए को वापस लाएगा। अब ए को सी के साथ बदलें, पहले लेनदेन की तरह।


4
usinf popStackImmediate (): -> getView ()। setOnKeyListener (नया दृश्य .nKeyListener () {@Override सार्वजनिक बूलियन onKey (देखें v, int keyCode, KeyEvent घटना) {if (keyCode == KeyEvent.KEYCODE_BACKE) .getSupportFragmentManager (); popBackStackImmediate (); वापसी;}}} असत्य लौटें;}}};
यश अग्रवाल

131

मैं से कोड बदलता हूं getActivity().getFragmentManager().beginTransaction().remove(this).commit();

सेवा

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

और यह टुकड़े को बंद कर सकता है।


35
getActivity () onBackPressed ()।; Thik यह वही करेगा जो आपने समझाया है।
विश्वनाथ लीक्षमान

4
@ suomi35 नं। जब आपको
ओवरराइडड्रेस की

काम नहीं लगता। 2016 में, setNavigationOnClickListener में काम नहीं करता है।

1
@ViswanathLekshmanan मुझे लगता है कि यह एक टिप्पणी के बजाय एक उत्तर होना चाहिए। और स्वीकृत उत्तर, इसके अतिरिक्त।
फ्रांसिस्को रोमेरो

1
यह गतिविधि को भी बंद कर देता है! केवल फ्रैगमेंट समापन की आवश्यकता है।
ज़ोन

70

उन लोगों के लिए जिन्हें सरल तरीके से जानने की जरूरत है

प्रयत्न getActivity().onBackPressed();


getActivity () कई बार अशक्त हो सकती है।
अर्पित जे।

1
@ArpitJ। onAttach () कहा जाता है, इससे पहले कि यह केवल शून्य है, एक टुकड़ा एक गतिविधि के बिना नहीं रह सकता है।
तमीम अताफी

@TamimAttafi यह सच है, लेकिन मैं ऐसे मामलों का जिक्र कर रहा था जैसे रोटेशन या गतिविधि समाप्त हो गई है और किसी कारण से खंड का उदाहरण अभी भी है तो यह अशक्त हो जाएगा।
अर्पित जे।

popBackStack()और popBackStackImmediate()एक बटन प्रेस का अनुकरण किए बिना सबसे ऊपरी टुकड़े को पॉप करने के अधिक प्रत्यक्ष तरीके हैं। onBackPressed()ट्रिगर्स का उपयोग करना OnBackPressedCallback; अगर भविष्य में आप विशेष रूप से बैक बटन प्रेस को हैंडल करना चाहते हैं, तो आपको प्रोग्रामबैक रूप से कॉलबैक को ट्रिगर करने से बचने के लिए popBackStack()/ popBackStackImmediate()पर स्विच करना होगा ।
नोलन एमी

आपने इस कोड को फ्रैगमेंट के बटन्स ऑनक्लिक विधि के अंदर रखा है।
Anon


4

इसे इस्तेमाल करे:

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

इसलिए, जब आप बैक-की दबाते हैं , तो वर्तमान गतिविधि (जो कई टुकड़े रखती है) खुद को खत्म करने के बजाय पिछले टुकड़े को लोड करेगी।


4

आप इस तर्क को आजमा सकते हैं क्योंकि यह मेरे लिए काम कर रहा है।

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

4

यह ऐसा करने का एक कोटलिन तरीका है, मैंने खंड लेआउट में बटन बनाया है और फिर onViewtreated में onClickListner सेट किया है।

@ विश्वनाथ-लक्षमण की टिप्पणी के अनुसार

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

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

यह गतिविधि को बंद करता है, न कि टुकड़े
नब्बाना

3

इसे इस्तेमाल करे:

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

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
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह कोड क्यों और / या इस प्रश्न के उत्तर के बारे में अतिरिक्त संदर्भ प्रदान करता है, इसके दीर्घकालिक मूल्य में सुधार करता है।
रोलस्टूफ़्लोरहेयर

यह सरल कोड वास्तव में उस पर एक ठीक या बंद बटन द्वारा वर्तमान टुकड़ा दृश्य को हटा देता है। मैं एक फ्रेगमेंट के रूप में प्रदर्शित प्रकाश सेटिंग पैनल को छोड़ने के लिए इसका उपयोग करता हूं और गतिविधि पर वापस जाता हूं। इस ट्रिक के लिए क्षमा करें, लेकिन एंड्रॉइड 8 के तहत, मुझे लगता है कि कई फ्रेगमेंट को प्रबंधित करना इतना व्यावहारिक नहीं है।
ब्रूनो एल।

1

यदि आपको विशेष रूप से बैक बटन के साथ कार्रवाई को संभालने की आवश्यकता है तो आप निम्न विधि का उपयोग कर सकते हैं:

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

अपने Fragments में onCreateView(...)आप कॉल करके किसी दृश्य को हटा सकते हैं container.removeView(view);। इसलिए यदि आप टुकड़े को हटाना चाहते हैं, तो viewउसका वापसी मूल्य होना चाहिए onCreateView,

उदाहरण के लिए

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

-7

इसको आजमाओ

getActivity().finish();

1
अपने उत्तर को और अधिक समझाने की कोशिश करें, ताकि ओपी और अन्य लोगों के लिए इसका उत्तर समझने में आसानी हो, जो भविष्य में इस प्रश्न पर वापस आते हैं
अमन छाबड़ा

7
यह पूरी गतिविधि को बंद कर देता है, न कि टुकड़े
बूसू

इसने मेरी मदद की। जो लोग अधिक जानकारी चाहते हैं वे इसे Google कर सकते हैं। यहां आधिकारिक दस्तावेज को कॉपी करने की आवश्यकता नहीं है।
Alesha170

यदि आप बॉटम नेशनव्यू व्यू का उपयोग कर रहे हैं जिसमें आमतौर पर एक गतिविधि होती है, तो यह कमांड पिछले टुकड़े को वापस पाने के बजाय ऐप को बंद कर देगा।
एलिटन ओलिवेरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.