Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

फ्रैगमेंट में कॉन्टेक्स्ट का उपयोग कैसे करें?

फ्रैगमेंट में Context प्राप्त करना - सही तरीके

एक फ्रैगमेंट Context नहीं है, लेकिन इसके पास कई मान्य स्रोतों के माध्यम से एक तक पहुंच है। गलत स्रोत चुनने से लीक, क्रैश, या गलत थीम/संसाधन होते हैं।

त्वरित संदर्भ तालिका

स्रोतउपलब्धजीवनचक्रउपयोग-मामला
requireContext()onAttach के बादफ्रैगमेंट से जुड़ा**डिफ़ॉल्ट विकल्प** — अधिकांश मामलों के लिए सुरक्षित, नॉन-नल
getContext()onAttach के बादफ्रैगमेंट से जुड़ाrequireContext() के समान लेकिन @Nullable
requireActivity()onAttach के बादगतिविधि जीवनचक्रजब विशेष रूप से गतिविधि की आवश्यकता हो (उदाहरण: startActivityForResult)
getActivity()onAttach के बादगतिविधि जीवनचक्रनल करने योग्य संस्करण
getApplicationContext()कभी भीप्रक्रिया जीवनचक्रसिंगलटन, डेटाबेस, लंबे समय तक चलने वाले ऑब्जेक्ट्स (UI नहीं)
requireView().getContext()onViewCreated के बादव्यू जीवनचक्रव्यू-विशिष्ट संसाधन (थीम, आयाम)

सर्वोत्तम अभ्यास

  1. डिफ़ॉल्ट रूप से requireContext() का उपयोग करें — यह नल नहीं हो सकता जब फ्रैगमेंट जुड़ा हुआ हो, इरादा स्पष्ट करता है।
  2. onAttach से पहले Context एक्सेस न करें — onCreate, कंस्ट्रक्टर, या फील्ड इनिशियलाइज़र में getContext() नल लौटाता है।
  3. View-विशिष्ट संसाधनों के लिए (उदाहरण: TypedArray, थीम विशेषताएं), requireView().getContext() का उपयोग करें onViewCreated में।
  4. लंबे समय तक चलने वाले ऑब्जेक्ट्स (कॉरआउटिन स्कोप, डेटाबेस, रिपॉजिटरी) के लिए requireActivity().getApplicationContext() पास करें।
  5. Context को फील्ड में स्टोर न करें — यह लीक का कारण बनता है; हर बार प्राप्त करें।

कोड उदाहरण

public class SampleFragment extends Fragment {

    // ✅ अच्छा: ऑन-डिमांड, नॉन-नल
    private void showToast(String msg) {
        Toast.makeText(requireContext(), msg, Toast.LENGTH_SHORT).show();
    }

    // ✅ अच्छा: View-विशिष्ट संसाधनों के लिए
    @Override
    public void onViewCreated(@NonNull View view, Bundle saved) {
        super.onViewCreated(view, saved);
        Context viewContext = requireView().getContext();
        int color = ContextCompat.getColor(viewContext, R.color.my_color);
        view.findViewById(R.id.someView).setBackgroundColor(color);
    }

    // ✅ अच्छा: एप्लिकेशन-स्कोप्ड ऑब्जेक्ट्स के लिए
    private void initRepository() {
        MyRepository repo = new MyRepository(requireActivity().getApplicationContext());
    }

    // ❌ खराब: फील्ड में स्टोर करना
    // private Context savedContext; // लीक!

    // ❌ खराब: onCreate में getContext() — नल होगा
    @Override
    public void onCreate(Bundle saved) {
        super.onCreate(saved);
        // Context ctx = getContext(); // null!
    }
}

आम बग

लक्षणकारणसमाधान
NPE getContext() परonAttach से पहले कॉल किया गयाrequireContext() का उपयोग करें या onAttach/onViewCreated तक प्रतीक्षा करें
लीक की गई गतिविधिContext को स्टेटिक/सिंगलटन में स्टोर किया गयाएप्लिकेशन कॉन्टेक्स्ट पास करें या WeakReference का उपयोग करें
गलत थीम/संसाधनथीम वाले संसाधनों के लिए एप्लिकेशन कॉन्टेक्स्ट का उपयोग किया गयाrequireContext() या requireView().getContext() का उपयोग करें

मूल उदाहरण की समीक्षा

मूल कोड getActivity() को एक TextView में प्रिंट करता था बिना नल-चेक के, onCreateView में (जहां यह नॉन-नल है लेकिन नाजुक है)। ऊपर दिया गया पैटर्न सुरक्षित, आधुनिक उपयोग दिखाता है।

  1. फ्रैगमेंट में findViewById का उपयोग कैसे करें? फ्रैगमेंट में findViewById का उपयोग कैसे करें?

    फ्रैगमेंट में findViewById - सही पैटर्न एक फ्रैगमेंट का व्यू पदानुक्रम onCreateView में बनाया जाता है। व्यू को **उसी व्यू पर** खोजें जिसे आप इन्फ्लेट करते हैं, गतिविधि पर नहीं। सही पैटर्न textView.setText(क्लिक किया गया!)); // 4. रूट व्यू वापस करें return rootView; } // व

  1. Android Toolbar में SearchView का उपयोग कैसे करें? Android Toolbar में SearchView का उपयोग कैसे करें?

    Android Toolbar/ActionBar में SearchView जोड़कर ListView फ़िल्टर करना टूलबार में सर्च आइकन जोड़कर ListView डेटा को रियल-टाइम फ़िल्टर करने का पूरा उदाहरण। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project। चरण 2: लेआउट में Toolbar और ListView res/layout/activity_main.xml: <?xml ve

  1. एंड्रॉइड में XMLPullParser से XML पार्स कैसे करें? एंड्रॉइड में XMLPullParser से XML पार्स कैसे करें?

    एंड्रॉइड में XMLPullParser का उपयोग करके XML डेटा पार्स करना XMLPullParser एंड्रॉइड में XML प्रोसेसिंग के लिए एक हल्का, कुशल और लो-मेमोरी पार्सर है। यह पुल मॉडल पर काम करता है — यानी आप पार्सर से अगला इवेंट मांगते हैं, बजाय इसके कि पार्सर आपको कॉलबैक दे (जैसे SAX)। यह बड़े XML फाइल्स के लिए आदर्श है