एक टुकड़े से वर्तमान गतिविधि को समाप्त करना


96

मेरे पास एक गतिविधि में एक टुकड़ा है जिसे मैं नेविगेशन दराज के रूप में उपयोग कर रहा हूं। इसमें ऐसे बटन होते हैं, जिन पर क्लिक करने पर नई गतिविधियाँ शुरू होती हैं (एक अंश से प्रारंभता केवल वर्तमान गतिविधि पर प्रारंभता कहती है)।

मेरे जीवन के लिए मुझे यह पता नहीं लग सकता है कि मैं एक नई शुरुआत करने के बाद वर्तमान गतिविधि को कैसे समाप्त करूंगा।

मैं इस खंड में कुछ ऐसा हासिल करना चाहता हूं:

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

लेकिन ऐसा लगता है कि Fragment.class फिनिश को लागू नहीं करता है () (जैसे यह इम्प्लीमेन्ट स्टार्ट एक्टिविटी (...) लागू करता है।

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

जवाबों:


277

टुकड़ों के साथ काम करते समय, thisसंदर्भ का उपयोग करने या संदर्भित करने के बजाय , हमेशा उपयोग करें getActivity()। आपको फोन करना चाहिए

getActivity().finish();

अपनी गतिविधि को समाप्त करने के लिए।


12
getActivity()nullकुछ मामलों में हो सकता है। फिर हमें क्या करना चाहिए?
मतज क्रिस्ल

3
@ user983956 ऐसे मामलों में गतिविधि पहले ही नष्ट हो जाती है, इसलिए अभी कॉल न करें finish
क्रिस्टियान

2
एक टिप के रूप में: getActivity शून्य हो सकती है यदि आप इसे देखने से पहले इसे इस्तेमाल करने की कोशिश करते हैं
csanonymus

1
गतिविधि को नियंत्रक / प्रभारी होना चाहिए टुकड़ा नहीं, आपको कॉलबैक इंटरफ़ेस के बजाय गतिविधि को कॉलबैक करना चाहिए और गतिविधि को यह तय करने देना चाहिए कि क्या यह स्वयं को समाप्त करना चाहिए।
अहमद

1
इसके अलावा, यदि आपके पास गतिविधि में एकल इंजेक्शन हैं, तो उन्हें नष्ट करने के लिए मत भूलना, यह मेमोरी लीक बनाएगा, या यदि कॉलबैक हैं तो उन्हें हटा दें। , अगर (getActivity ()! = null) {getActivity ()। removeCallbacks (); getActivity () को नष्ट ()।; }
ओम जूल

26

अच्छी तरह से वास्तव में...

मेरे पास फ्रैगमेंट गतिविधि को खत्म करने की कोशिश नहीं होगी। यह मेरी राय में Fragment पर बहुत अधिक अधिकार रखता है। इसके बजाय, मैं यहां मार्गदर्शिका का उपयोग करूंगा: http://developer.android.com/training/basics/fragments/Queryunicic.html

फ्रेगमेंट एक इंटरफ़ेस को परिभाषित करता है जिसे गतिविधि को लागू करना चाहिए। गतिविधि पर कॉल करें, फिर गतिविधि को जानकारी के साथ क्या करना है, यह तय करने दें। यदि गतिविधि खुद को समाप्त करना चाहती है, तो यह कर सकती है।


2
यह एक अच्छा बिंदु है, क्योंकि किसी एक गतिविधि में कई टुकड़े मौजूद हो सकते हैं। जैसा कि आप उल्लेख करते हैं, एक टुकड़ा के लिए अपनी गतिविधि पर वापस संचार करने का पसंदीदा तरीका एक इंटरफ़ेस है।
सास्वचेक

11

जैसा कि जॉन एफ हैनकॉक ने उल्लेख किया है , यह है कि गतिविधि को बंद करने का सुझाव देकर एक टुकड़ा गतिविधि को 'बंद' कर सकता है। यह टुकड़े को पोर्टेबल बनाता है जैसा कि उनके लिए कारण है। यदि आप इसे किसी अन्य गतिविधि में उपयोग करते हैं, तो आप गतिविधि को बंद नहीं करना चाह सकते हैं।

नीचे दिया गया कोड एक गतिविधि और टुकड़े से एक स्निपेट है जिसमें एक सेव और कैंसल बटन है।

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, जिसमें एक इंटरफ़ेस होता है जिसे कॉलिंग गतिविधि को लागू करने की आवश्यकता होती है।

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

1

जब भी मैं टुकड़े को बंद करने के लिए फिनिश का उपयोग करता हूं, पूरी गतिविधि बंद हो जाती है। डॉक्स के अनुसार, जब तक मूल गतिविधि बनी रहती है तब तक टुकड़े होते रहना चाहिए।

इसके बजाय, मैंने पाया कि मैं इस कथन का उपयोग करके मूल गतिविधि को वापस देख सकता हूं: setContentView (R.layout.activity_main);

यह मुझे मूल गतिविधि पर वापस लौटाता है।

मुझे उम्मीद है कि यह किसी और की मदद करता है जो इस की तलाश में हो सकता है।


1

बहुत आसान...

1- सिर्फ getActivity()अंश में गतिविधि को पकड़ो

2- फिर कॉल करें finish();

तो बस getActivity().finish();पैरेंट एक्टिविटी खत्म कर देंगे।


1

टुकड़े से गतिविधि समाप्त करने के लिए आपको getActivity () विधि का उपयोग करना चाहिए।

getActivity().finish();

1

Fragment में getActivity.finishAffinity () का उपयोग करें

getActivity().finishAffinity();

यह उन सभी अंशों को हटा देगा जो वर्तमान गतिविधि से स्टैक के साथ गतिविधि में भी धकेल दिए गए हैं ...


फिनिशएफ़िनिटी () में सभी गतिविधियाँ हैं जो एक ही आत्मीयता को हटाएंगे, इसलिए वर्तमान गतिविधि के नीचे की गतिविधियाँ जिनमें स्टैक में अंश शामिल हैं उन्हें भी समाप्त किया जा सकता है।
जकारिया एम। जवास

0

इसे इस्तेमाल करे। कोई चेतावनी नहीं होनी चाहिए ...

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

0

15 जून 2020 - अपडेट किया गया उत्तर।

आपके पास जावा और कोटलिन के लिए दो विकल्प हैं। हालांकि, दोनों तरीकों के तर्क समान हैं। कॉल फिनिश () विधि के बाद आपको गतिविधि को कॉल करना चाहिए ।

कोटलिन के लिए उत्तर ,

यदि आपकी गतिविधि शून्य नहीं है, तो Answer_1 का उपयोग करें । हालाँकि, यदि आपकी गतिविधि शून्य हो सकती है , तो Answer_2 का उपयोग करें

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

जावा के लिए उत्तर,

getActivity().finish();

@canerkaseler


-1

इसका उपयोग करने का प्रयास करें

हां Fragment.classलागू नहीं होता हैfinish()

टुकड़ों के साथ काम करते समय, इस का उपयोग करने या संदर्भ को संदर्भित करने के बजाय, हमेशा उपयोग करें getActivity()। आपको फोन करना चाहिए


11
मुझे अपने उत्तर और पहले उत्तर के बीच का अंतर बताइए (@ coder_For_Life22 द्वारा) ...
फिलिप ब्रिटो

इसकी एक जाल न
demotivated
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.