फ्रैगमेंट में findViewById - सही पैटर्न
एक फ्रैगमेंट का व्यू पदानुक्रम onCreateView में बनाया जाता है। व्यू को **उसी व्यू पर** खोजें जिसे आप इन्फ्लेट करते हैं, गतिविधि पर नहीं।
सही पैटर्न
public class MyFragment extends Fragment {
private TextView textView;
private Button button;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// 1. लेआउट इन्फ्लेट करें
View rootView = inflater.inflate(R.layout.fragment_my, container, false);
// 2. rootView पर व्यू खोजें (गतिविधि पर नहीं!)
textView = rootView.findViewById(R.id.textView);
button = rootView.findViewById(R.id.button);
// 3. लिसनर सेट करें, आदि।
button.setOnClickListener(v -> textView.setText("क्लिक किया गया!"));
// 4. रूट व्यू वापस करें
return rootView;
}
// वैकल्पिक: व्यू नष्ट होने पर नल करें (लीक से बचाता है)
@Override
public void onDestroyView() {
super.onDestroyView();
textView = null;
button = null;
}
}
आम गलतियां
| गलत | क्यों गलत है | सही |
|---|---|---|
getActivity().findViewById(R.id.x) फ्रैगमेंट में | गतिविधि के लेआउट को खोजता है, फ्रैगमेंट के नहीं; NPE या गलत व्यू लौटाता है | rootView.findViewById(R.id.x) |
findViewById(R.id.x) फ्रैगमेंट में (कोई रिसीवर नहीं) | फ्रैगमेंट में यह विधि नहीं है (केवल गतिविधि/व्यू में) | rootView.findViewById(...) या requireView().findViewById(...) |
फील्ड में व्यू स्टोर करना और onDestroyView में साफ़ न करना | फ्रैगमेंट व्यू नष्ट होने के बाद लीक होता है (उदाहरण: बैक स्टैक) | onDestroyView में नल करें |
onCreate में व्यू एक्सेस करना | व्यू पदानुक्रम अभी तक मौजूद नहीं है | onCreateView या onViewCreated का उपयोग करें |
आधुनिक विकल्प: View Binding (अनुशंसित)
// build.gradle में सक्षम करें:
android {
buildFeatures { viewBinding = true }
}
// फ्रैगमेंट में:
private FragmentMyBinding binding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
binding = FragmentMyBinding.inflate(inflater, container, false);
binding.button.setOnClickListener(v -> binding.textView.setText("क्लिक किया गया!"));
return binding.getRoot();
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null; // बाइंडिंग नल करें
}
View Binding के लाभ
- प्रकार-सुरक्षित, कास्टिंग नहीं,
findViewByIdकॉल नहीं। - कॉम्पाइल-टाइम जांच — लेआउट में गलत ID = बिल्ड त्रुटि।
- स्वचालित नल-सुरक्षा (बाइंडिंग नल करने योग्य नहीं)।
मूल उदाहरण की समीक्षा
मूल कोड root.findViewById(R.id.text) का सही ढंग से उपयोग करता था लेकिन onDestroyView क्लीनअप, व्यू बाइंडिंग, और नल-सुरक्षा की कमी थी। ऊपर दिए गए पैटर्न आधुनिक मानक हैं।