संदर्भ से FragmentManager

मैंने एक नया <�कोड> देखें वर्ग बनाया है। उस कक्षा के भीतर मुझे FragmentManager तक पहुंच प्राप्त करने की आवश्यकता है, लेकिन मैं यह नहीं समझ सकता कि कैसे।

क्या मैं किसी संदर्भ से FragmentManager तक पहुंच सकता हूं?

CustomView extends LinearLayout
32
जोड़ा संपादित
विचारों: 1

5 उत्तर

केवल तभी दिया गया संदर्भ गतिविधि (पोस्ट-हनीकॉम्ब) या फ्रैगमेंट एक्टिविटी (प्री-हनीकॉम) बढ़ाता है।

इस मामले में आपको 100% सुनिश्चित करना होगा कि यह प्रतिबिंब या प्रयास-पकड़ का उपयोग कर एक गतिविधि है।

try{
  final Activity activity = (Activity) context;

 //Return the fragment manager
  return activity.getFragmentManager();

 //If using the Support lib.
 //return activity.getSupportFragmentManager(); 

} catch (ClassCastException e) {
  Log.d(TAG, "Can't get the fragment manager with this");
}

सोचा कि मैं refactoring की सिफारिश करते हैं तो एक देखें वास्तव में सामान दिखाने के लिए है और वास्तव में आपके ऐप की स्थिति को संशोधित नहीं करना चाहिए, लेकिन यह मेरी राय है।

48
जोड़ा
एक संवाद प्रारूप में प्रश्न में दृश्य शामिल है। मेरे मूल रूप से एक संवादप्रवाह है जो वर्तमान में चुने गए बटन के आधार पर अनुभागों में विभाजित है, मैं उपयुक्त दृश्य दिखाता हूं। मैंने प्रत्येक प्रदर्शित करने योग्य खंड को अपने स्वयं के दृश्य में विभाजित किया। मैं एक टुकड़ा इस्तेमाल किया होता, लेकिन मैं एक टुकड़े के भीतर एक टुकड़ा एम्बेड नहीं कर सकता।
जोड़ा लेखक Steve, स्रोत
मैं बस आईडी द्वारा दृश्य ढूंढने जा रहा हूं, और गतिविधि के संदर्भ में पास हूं।
जोड़ा लेखक Steve, स्रोत
यही वह कर रहा है। डायलॉगफ्रैगमेंट विचारों को स्वैप कर रहा है। हालांकि, मेरे पास कुछ तर्क शामिल हैं, और संभावित रूप से घटनाओं के उपयोग के जवाब में अन्य संवाद खंड प्रदर्शित करते हैं, इसलिए विचारों को खंड प्रबंधक प्राप्त करने का एक तरीका चाहिए। मुझे पता है कि विचारों में तर्क शामिल होने की अनुशंसा नहीं की जाती है .. मुझे यकीन है कि अनुभागों को विभाजित करने का एक बेहतर तरीका नहीं है।
जोड़ा लेखक Steve, स्रोत
क्यों डायलॉगफ्रैगमेंट हैंडल दृश्य स्वैपिंग नहीं है? ऐसा लगता है कि यह उतना जटिल होगा जितना आप करने की कोशिश कर रहे हैं।
जोड़ा लेखक DeeV, स्रोत
@LeiLeyba: टुकड़ों में "getFragmentManager ()" और "getChildFragmentManager ()" विधियां हैं, इसलिए मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। यदि फ्रैगमेंट किसी गतिविधि से जुड़ा हुआ नहीं है तो वे (शायद) वापस शून्य करेंगे। आप FragmentManager का उपयोग करने के लिए "getActivity ()। GetFragmentManager ()" का भी उपयोग कर सकते हैं।
जोड़ा लेखक DeeV, स्रोत
"इस मामले में आपको 100% सुनिश्चित करना होगा कि यह प्रतिबिंब या प्रयास-पकड़ का उपयोग कर एक गतिविधि है।" या बस उदाहरण के ऑपरेटर का उपयोग करना बेहतर है।
जोड़ा लेखक Zsolt Safrany, स्रोत
क्या होगा अगर यह टुकड़े टुकड़े हो जाता है?
जोड़ा लेखक Lei Leyba, स्रोत

यदि आप समर्थन टुकड़ों का उपयोग कर रहे हैं, तो आप शायद वास्तव में चाहते हैं:

try {
  FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager();
} catch (ClassCastException e) {
  Log.e(TAG, "Can't get fragment manager");
}
30
जोड़ा

इसी से मेरा काम बना है:

Context mContext;
...


//Get FragmentManager
FragmentManager fragmentManager = ((Activity) mContext).getFragmentManager();

(बेशक आपको सबसे पहले mContext प्रारंभ करना होगा)

5
जोड़ा
कास्टिंग का यह तर्क क्या है, यह कैसे संभव हो गया
जोड़ा लेखक blackHawk, स्रोत

आप किसी एप्लिकेशन में एक FragmentManager (या SupportFragmentManager) तक पहुंच प्राप्त कर सकते हैं - लेकिन जैसा कि अन्य उत्तरों से पता चलता है, आप केवल गतिविधि उदाहरण के माध्यम से ऐसा कर सकते हैं।

हालांकि, आप गतिविधि LifecycleCallbacks इंटरफ़ेस का उपयोग कर किसी भी गतिविधि को सीधे कॉल करने की आवश्यकता के बिना किसी गतिविधि के माध्यम से FragmentManager तक पहुंच प्राप्त कर सकते हैं:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks {

    @Override
    public void onActivityCreated(Activity activity, Bundle bundle) {
        activity.getFragmentManager()
        if(activity instanceof FragmentActivity) {
            ((FragmentActivity)activity).getSupportFragmentManager();
        }
        unregisterActivityLifecycleCallbacks(this);
    }

    ...
3
जोड़ा

चूंकि आपकी संदर्भ वस्तु को हमेशा गतिविधि में सीधे नहीं डाला जा सकता है, यह ऐसा करने का एक और अधिक विश्वसनीय तरीका है:

@Nullable
public static Activity getActivityFromContext(@NonNull Context context){
    while (context instanceof ContextWrapper) {
        if (context instanceof Activity) return (Activity) context;
        context = ((ContextWrapper)context).getBaseContext();
    }
    return null; //we failed miserably 
}
1
जोड़ा