एंड्रॉइड में कस्टम लिसनर इंटरफेस बनाना
कस्टम इंटरफेस घटकों (फ्रैगमेंट → गतिविधि, व्यू → प्रेजेंटर, एडॉप्टर → फ्रैगमेंट) को अलग करते हैं। यह गाइड एक पुन: प्रयोज्य, नल-सुरक्षित पैटर्न दिखाता है।
चरण 1 - इंटरफेस परिभाषित करें
public interface OnItemActionListener {
void onItemClick(String itemName, int position);
void onItemLongClick(String itemName, int position);
}
चरण 2 - इवेंट स्रोत में लागू करें (उदाहरण: फ्रैगमेंट)
public class SourceFragment extends Fragment {
private OnItemActionListener listener;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
if (context instanceof OnItemActionListener) {
listener = (OnItemActionListener) context;
} else {
throw new ClassCastException(context + " को OnItemActionListener लागू करना होगा");
}
}
@Override
public void onDetach() {
super.onDetach();
listener = null; // लीक रोकें
}
// आंतरिक रूप से कॉल करें (उदाहरण: बटन क्लिक पर)
private void notifyClick(String name, int pos) {
if (listener != null) {
listener.onItemClick(name, pos);
}
}
}
चरण 3 - उपभोक्ता में लागू करें (उदाहरण: गतिविधि)
public class MainActivity extends AppCompatActivity implements OnItemActionListener {
@Override
public void onItemClick(String itemName, int position) {
Toast.makeText(this, "क्लिक किया गया: " + itemName + " @ " + position, Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(String itemName, int position) {
// संदर्भ मेनू दिखाएं, आदि।
}
}
वैकल्पिक: सेटर-आधारित पंजीकरण (फ्रैगमेंट-टू-फ्रैगमेंट के लिए)
public class SourceFragment extends Fragment {
private OnItemActionListener listener;
public void setOnItemActionListener(OnItemActionListener l) { this.listener = l; }
// ... notifyClick() में उपयोग करें
}
// पैरेंट/होस्ट में:
SourceFragment src = (SourceFragment) getSupportFragmentManager().findFragmentById(R.id.src);
src.setOnItemActionListener(this::onItemClick); // लैंबडा यदि इंटरफेस फंक्शनल है
सर्वोत्तम अभ्यास
- इंटरफेस को छोटा रखें — सिंगल-मेथड इंटरफेस लैंब्डा के साथ काम करते हैं (SAM रूपांतरण)।
- onDetach/onDestroy में नल करें — मेमोरी लीक से बचाता है।
- नामकरण:
On<Event>Listenerया<Component>Callback। - पैरामीटर: कच्चे व्यू के बजाय डेटा पास करें (डिकॉउपलिंग)।
- डिफ़ॉल्ट मेथड (Java 8+): वैकल्पिक कॉलबैक के लिए डिफ़ॉल्ट खाली कार्यान्वयन प्रदान करें।
मूल उदाहरण की समीक्षा
दिया गया कोड गतिविधि में सीधे इंटरफेस लागू करता है और onAttach में कास्ट करता है। यह काम करता है लेकिन नल-सुरक्षा, डिटैच क्लीनअप और एकाधिक विधियों की कमी है। ऊपर दिया गया पैटर्न उत्पादन-तैयार है।
परीक्षण
- फ्रैगमेंट वाले ऐप पर चलाएं।
- फ्रैगमेंट में बटन टैप करें → गतिविधि टोस्ट दिखाती है।
- घुमाएं → लिसनर पुनः संलग्न होता है (कोई लीक नहीं)।