ठीक Android कैसे करता है: onClick XML विशेषता setOnClickListener से भिन्न है?


416

इससे मैंने पढ़ा है कि आप एक onClickहैंडलर को दो तरह से बटन पर असाइन कर सकते हैं ।

android:onClickएक्सएमएल विशेषता का उपयोग करना जहां आप सिर्फ हस्ताक्षर के साथ void name(View v)या setOnClickListenerविधि का उपयोग करके उस स्थान का उपयोग करते हैं जहां आप एक ऑब्जेक्ट पास करते हैं जो OnClickListenerइंटरफ़ेस को लागू करता है। उत्तरार्द्ध को अक्सर एक अनाम वर्ग की आवश्यकता होती है जो व्यक्तिगत रूप से मुझे पसंद नहीं है (व्यक्तिगत स्वाद) या एक आंतरिक वर्ग को परिभाषित करना जो इसे लागू करता है OnClickListener

XML विशेषता का उपयोग करके आपको केवल एक वर्ग के बजाय एक विधि को परिभाषित करने की आवश्यकता है इसलिए मैं सोच रहा था कि क्या कोड के माध्यम से ही किया जा सकता है और XML लेआउट में नहीं।


4
मैं आपकी समस्या को पढ़ता हूं और मुझे लगता है कि आप मेरी तरह ही एक ही जगह पर अटके हुए हैं। मेरे पास एक बहुत अच्छा वीडियो आया जिसने मुझे मेरे मुद्दे को सुलझाने में बहुत मदद की। निम्नलिखित लिंक पर वीडियो खोजें: youtube.com/watch?v=MtmHURWKCmg&feature=youtu.be मुझे आशा है कि यह आपकी भी मदद करेगा :)
user2166292

9
उन लोगों के लिए जो उपरोक्त टिप्पणी में पोस्ट किए गए वीडियो को देखने के लिए समय बचाना चाहते हैं, यह केवल यह दर्शाता है कि onClickलेआउट फ़ाइल में विशेषता के लिए दो बटन में एक ही विधि कैसे हो सकती है । यह पैरामीटर के लिए धन्यवाद किया जाता है View v। आप बस जांच if (v == findViewById(R.id.button1)) आदि ..
CodyBugstein

13
@ मुझे लगता है कि इसका उपयोग करना बेहतर होगा v.getId() == R.id.button1, क्योंकि आपको वास्तविक नियंत्रण खोजने और तुलना करने की आवश्यकता नहीं है। और आप switchबहुत सारे ifs के बजाय उपयोग कर सकते हैं ।
सामी कुहोमेन 18

3
यह ट्यूटोरियल आपकी बहुत मदद करेगा। यहाँ क्लिक करें
c49

Xml android का उपयोग करना: onClick दुर्घटना का कारण बनता है।

जवाबों:


604

नहीं, यह कोड के माध्यम से संभव नहीं है। OnClickListenerजब आप android:onClick="someMethod"विशेषता को परिभाषित करते हैं तो एंड्रॉइड आपके लिए लागू होता है।

वे दो कोड स्निपेट समान हैं, बस दो अलग-अलग तरीकों से लागू किए जाते हैं।

कोड कार्यान्वयन

Button btn = (Button) findViewById(R.id.mybutton);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        myFancyMethod(v);
    }
});

// some more code

public void myFancyMethod(View v) {
    // does something very interesting
}

ऊपर एक का कोड कार्यान्वयन है OnClickListener। और यह XML कार्यान्वयन है।

XML कार्यान्वयन

<?xml version="1.0" encoding="utf-8"?>
<!-- layout elements -->
<Button android:id="@+id/mybutton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click me!"
    android:onClick="myFancyMethod" />
<!-- even more layout elements -->

पृष्ठभूमि में, एंड्रॉइड जावा कोड के अलावा और कुछ नहीं करता है, एक क्लिक इवेंट पर आपके तरीके को कॉल करता है।

ध्यान दें कि ऊपर एक्सएमएल के साथ, एंड्रॉइड केवल वर्तमान गतिविधि में onClickविधि की तलाश करेगा myFancyMethod()। यह याद रखना महत्वपूर्ण है कि क्या आप अंशों का उपयोग कर रहे हैं, क्योंकि भले ही आप टुकड़े टुकड़े का उपयोग करके ऊपर एक्सएमएल जोड़ते हैं, एंड्रॉइड XML को जोड़ने के लिए उपयोग किए गए टुकड़े onClickकी .javaफ़ाइल में विधि की तलाश नहीं करेगा ।

एक और महत्वपूर्ण बात जो मैंने देखी। आपने उल्लेख किया कि आप गुमनाम तरीकों को पसंद नहीं करते हैं । आपका कहने का मतलब है कि आपको अनाम कक्षाएं पसंद नहीं हैं ।


4
मैं जावा गुरु नहीं हूं लेकिन हां, मेरा मतलब अनाम वर्ग से है। आपके जवाब के लिए धन्यवाद। बहुत साफ़।
13

118
ध्यान दें कि यदि आप XML ओनलाइन का उपयोग करते हैं, तो आपको myFancyMethod()चालू गतिविधि में ऑनक्लिक विधि ( ) डालनी होगी । यदि आप अंशों का उपयोग कर रहे हैं तो यह महत्वपूर्ण है, क्योंकि onclick श्रोताओं को सेट करने के प्रोग्रामेटिक तरीके से संभवत: किसी खंड के onCreateView () ... में क्लिक हैंडल करने की विधि होगी जहां यह XML से संदर्भित होने पर नहीं मिलेगा ।
पीटर अज़ताई

12
हां, विधि को सार्वजनिक करना होगा।
ऑक्टेवियन ए। डामियन

12
दिलचस्प बात यह है कि इसे कोड में करने से किसी को विधि को निजी बनाने के लिए उपयोग करने की अनुमति मिलती है, जबकि इसे करने के लिए xml तरीका विधि के संपर्क में आता है।
bgse

5
तथ्य यह है कि फ़ंक्शन (XML दृष्टिकोण में) गतिविधि में होना आवश्यक है न केवल जब आप टुकड़े पर विचार करते हैं, बल्कि कस्टम दृश्य (बटन युक्त) भी। जब आपके पास एक कस्टम दृश्य होता है जिसे आप कई गतिविधियों में पुन: उपयोग करते हैं, लेकिन आप सभी मामलों के लिए एक ही ऑनक्लिक विधि का उपयोग करना चाहते हैं, तो XML विधि सबसे सुविधाजनक नहीं है। आपको अपने कस्टम दृश्य का उपयोग करने वाली प्रत्येक गतिविधि में इसे (उसी शरीर के साथ )ClickMethod पर रखना होगा।
बार्टेक लिपिंस्की

87

जब मैंने शीर्ष उत्तर को देखा, तो मुझे एहसास हुआ कि मेरी समस्या फैंसी विधि पर पैरामीटर (देखें v) नहीं डाल रही है:

public void myFancyMethod(View v) {}

जब इसे xml से एक्सेस करने की कोशिश कर रहे हैं, तो किसी को उपयोग करना चाहिए

android:onClick="myFancyMethod"/>

आशा है कि किसी की मदद करता है।


74

android:onClick एपीआई स्तर 4 के बाद के लिए है, इसलिए यदि आप <1.6 को लक्षित कर रहे हैं, तो आप इसका उपयोग नहीं कर सकते।


33

जाँच करें कि क्या आप विधि को सार्वजनिक करना भूल गए हैं!


1
इसे सार्वजनिक करना अनिवार्य क्यों है?
eRaisedToX

3
@eRaisedToX मुझे लगता है कि यह बहुत स्पष्ट है: अगर यह सार्वजनिक नहीं है तो इसे एंड्रॉइड फ्रेमवर्क से नहीं बुलाया जा सकता है।
m0skit0

28

उदाहरण के लिए आंतरिक रूप से कॉलिंग android:onClickमें विशेषता परिणाम निर्दिष्ट करना । इसलिए बिल्कुल कोई अंतर नहीं है।ButtonsetOnClickListener

स्पष्ट समझ रखने के लिए, आइए देखें कि एक्सएमएल onClickविशेषता को फ्रेमवर्क द्वारा कैसे नियंत्रित किया जाता है।

जब एक लेआउट फ़ाइल को फुलाया जाता है, तो इसमें निर्दिष्ट सभी दृश्य त्वरित होते हैं। इस विशिष्ट मामले में, निर्माता Buttonका उपयोग करके उदाहरण बनाया public Button (Context context, AttributeSet attrs, int defStyle)गया है। XML टैग में सभी विशेषताएँ संसाधन बंडल से पढ़ी जाती हैं और AttributeSetनिर्माणकर्ता के पास भेज दी जाती हैं ।

Buttonक्लास को क्लास से विरासत में मिला है Viewजिसके परिणामस्वरूप Viewकंस्ट्रक्टर को बुलाया जाता है, जो क्लिक कॉल बैक हैंडलर के माध्यम से सेटिंग का ख्याल रखता है setOnClickListener

OnClick विशेषता को attrs.xml में परिभाषित किया गया है , इसे View.java के रूप में संदर्भित किया जाता है R.styleable.View_onClick

यहाँ कोड है View.javaकि आप के लिए कॉल setOnClickListenerकरके अपने आप के लिए सबसे अधिक काम करता है।

 case R.styleable.View_onClick:
            if (context.isRestricted()) {
                throw new IllegalStateException("The android:onClick attribute cannot "
                        + "be used within a restricted context");
            }

            final String handlerName = a.getString(attr);
            if (handlerName != null) {
                setOnClickListener(new OnClickListener() {
                    private Method mHandler;

                    public void onClick(View v) {
                        if (mHandler == null) {
                            try {
                                mHandler = getContext().getClass().getMethod(handlerName,
                                        View.class);
                            } catch (NoSuchMethodException e) {
                                int id = getId();
                                String idText = id == NO_ID ? "" : " with id '"
                                        + getContext().getResources().getResourceEntryName(
                                            id) + "'";
                                throw new IllegalStateException("Could not find a method " +
                                        handlerName + "(View) in the activity "
                                        + getContext().getClass() + " for onClick handler"
                                        + " on view " + View.this.getClass() + idText, e);
                            }
                        }

                        try {
                            mHandler.invoke(getContext(), View.this);
                        } catch (IllegalAccessException e) {
                            throw new IllegalStateException("Could not execute non "
                                    + "public method of the activity", e);
                        } catch (InvocationTargetException e) {
                            throw new IllegalStateException("Could not execute "
                                    + "method of the activity", e);
                        }
                    }
                });
            }
            break;

जैसा कि आप देख सकते हैं, setOnClickListenerकॉलबैक को पंजीकृत करने के लिए कहा जाता है, जैसा कि हम अपने कोड में करते हैं। केवल अंतर यह है कि यह Java Reflectionहमारी गतिविधि में परिभाषित कॉलबैक विधि को लागू करने के लिए उपयोग करता है।

यहां अन्य उत्तरों में वर्णित मुद्दों का कारण दिया गया है:

  • कॉलबैक विधि सार्वजनिक होनी चाहिए : चूंकि Java Class getMethodइसका उपयोग किया जाता है, इसलिए केवल सार्वजनिक पहुंच विनिर्देशक वाले कार्यों की खोज की जाती है। अन्यथा IllegalAccessExceptionअपवाद को संभालने के लिए तैयार रहें ।
  • Fragment में OnClick के साथ Button का उपयोग करते समय, कॉलबैक को गतिविधि में परिभाषित किया जाना चाहिए : getContext().getClass().getMethod()कॉल वर्तमान खोज के लिए विधि खोज को प्रतिबंधित करता है, जो Fragment के मामले में गतिविधि है। इसलिए गतिविधि गतिविधि वर्ग के भीतर खोज की जाती है न कि फ्रैगमेंट क्लास।
  • कॉलबैक विधि को पैरामीटर को स्वीकार करना चाहिए : चूंकि Java Class getMethodविधि की खोज होती है जो View.classपैरामीटर के रूप में स्वीकार करता है।

1
मेरे लिए वह अनुपलब्ध टुकड़ा था - जावा क्लिककंटेक्स्ट () के साथ शुरू होने वाले क्लिक हैंडलर को खोजने के लिए परावर्तन का उपयोग करता है। यह मेरे लिए थोड़ा रहस्यमय था कि क्लिक एक गतिविधि से एक टुकड़ा तक कैसे फैलता है।
एंड्रयू क्विसर

15

यहाँ बहुत अच्छे उत्तर हैं, लेकिन मैं एक पंक्ति जोड़ना चाहता हूँ:

में android:onclickXML में, एंड्रॉयड का उपयोग करता जावा प्रतिबिंब इस संभाल करने के लिए दृश्य के पीछे।

और जैसा कि यहां बताया गया है, प्रतिबिंब हमेशा प्रदर्शन को धीमा कर देता है। (विशेष रूप से Dalvik VM पर)। पंजीकरण onClickListenerएक बेहतर तरीका है।


5
यह ऐप को कितना धीमा कर सकता है? :) आधा मिलीसेकंड; इतना भी नहीं? वास्तव में लेआउट को उभारने की तुलना में यह एक पंख और व्हेल की तरह है
कोनराड मोरावस्की

14

ध्यान दें कि यदि आप onClick XML सुविधा का उपयोग करना चाहते हैं, तो संबंधित विधि में एक पैरामीटर होना चाहिए, जिसका प्रकार XML ऑब्जेक्ट से मेल खाना चाहिए।

उदाहरण के लिए, एक बटन को उसके नाम स्ट्रिंग के माध्यम से आपकी विधि से जोड़ा जाएगा: android:onClick="MyFancyMethod"लेकिन विधि घोषणा को दिखाना चाहिए: ...MyFancyMethod(View v) {...

यदि आप इस सुविधा को मेनू आइटम में जोड़ने का प्रयास कर रहे हैं , तो XML फ़ाइल में इसका सटीक सिंटैक्स होगा लेकिन आपकी विधि इस प्रकार घोषित की जाएगी:...MyFancyMethod(MenuItem mi) {...


6

क्लिक श्रोताओं पर अपना सेट करने का दूसरा तरीका XML का उपयोग करना होगा। बस Android जोड़ें: अपने टैग पर onClick विशेषता।

जब भी संभव हो एक अनाम जावा वर्ग पर xml विशेषता "onClick" का उपयोग करने के लिए यह एक अच्छा अभ्यास है।

सबसे पहले, कोड में अंतर पर एक नजर डालते हैं:

XML विशेषता / onClick विशेषता

XML भाग

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/button1" 
    android:onClick="showToast"/>

जावा भाग

public void showToast(View v) {
    //Add some logic
}

बेनामी जावा क्लास / सेटऑनक्लिकस्टिकर

XML भाग

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

जावा भाग

findViewById(R.id.button1).setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Add some logic
        }
});

अनाम जावा वर्ग पर XML विशेषता का उपयोग करने के लाभ यहां दिए गए हैं:

  • बेनामी जावा वर्ग के साथ हमें हमेशा अपने तत्वों के लिए एक आईडी निर्दिष्ट करनी होती है, लेकिन XML विशेषता आईडी के साथ छोड़ा जा सकता है।
  • बेनामी जावा वर्ग के साथ हमें दृश्य के अंदर के तत्व (findViewById भाग) को सक्रिय रूप से खोजना होगा, लेकिन XML विशेषता के साथ एंड्रॉइड यह हमारे लिए करता है।
  • अनाम जावा वर्ग के लिए कोड की कम से कम 5 लाइनों की आवश्यकता होती है, जैसा कि हम देख सकते हैं, लेकिन XML विशेषता के साथ कोड की 3 लाइनें पर्याप्त हैं।
  • बेनामी जावा वर्ग के साथ हमें अपनी विधि का नाम "onClick" रखना है, लेकिन XML विशेषता के साथ हम अपने इच्छित किसी भी नाम को जोड़ सकते हैं, जो नाटकीय रूप से हमारे कोड की पठनीयता में मदद करेगा।
  • Google द्वारा API स्तर 4 रिलीज़ के दौरान Xml "onClick" विशेषता जोड़ी गई है, जिसका अर्थ है कि यह थोड़ा अधिक आधुनिक वाक्यविन्यास है और आधुनिक वाक्यविन्यास लगभग हमेशा बेहतर है।

बेशक, Xml विशेषता का उपयोग करना हमेशा संभव नहीं होता है, यहां कारण हैं कि हमने इसे क्यों नहीं चुना:

  • अगर हम टुकड़ों के साथ काम कर रहे हैं। onClick विशेषता को केवल एक गतिविधि में जोड़ा जा सकता है, इसलिए यदि हमारे पास एक टुकड़ा है, तो हमें एक अनाम वर्ग का उपयोग करना होगा।
  • यदि हम onClick श्रोता को एक अलग वर्ग में ले जाना चाहते हैं (हो सकता है कि यदि यह बहुत जटिल है और / या हम इसे अपने अनुप्रयोग के विभिन्न भागों में फिर से उपयोग करना चाहते हैं), तो हम xml विशेषता का उपयोग नहीं करना चाहेंगे या तो।

और कृपया ध्यान दें कि XML विशेषताओं का उपयोग करने वाले फ़ंक्शन को हमेशा सार्वजनिक होना चाहिए और अगर उन्हें निजी मुर्गी के रूप में घोषित किया जाता है तो इसका परिणाम अपवाद होगा।
बेस्टिन जॉन

5

जावा 8 के साथ, आप शायद विधि संदर्भ का उपयोग कर सकते हैं जो चाहें प्राप्त करने के लिए का हैं।

मान लें कि यह onClickएक बटन के लिए आपका ईवेंट हैंडलर है।

private void onMyButtonClicked(View v) {
    if (v.getId() == R.id.myButton) {
        // Do something when myButton was clicked
    }
}

फिर, आप इस तरह से कॉल onMyButtonClickedमें इंस्टेंस विधि संदर्भ पास setOnClickListener()करते हैं।

Button myButton = (Button) findViewById(R.id.myButton);
myButton.setOnClickListener(this::onMyButtonClicked);

यह आपको अपने आप से एक अनाम वर्ग को स्पष्ट रूप से परिभाषित करने से बचने की अनुमति देगा । हालाँकि मुझे इस बात पर ज़ोर देना चाहिए कि जावा 8 का मेथड रेफरेंस वास्तव में सिर्फ एक सिन्गनेटिक शुगर है। यह वास्तव में आपके लिए अनाम वर्ग का एक उदाहरण बनाता है (जैसे लैम्ब्डा एक्सप्रेशन किया था) इसलिए लैम्बडा-एक्सप्रेशन-स्टाइल ईवेंट हैंडलर के समान सावधानी बरती गई जब आप अपने ईवेंट हैंडलर के अपंजीकृत होने पर आते हैं। यह लेख बताता है कि यह वास्तव में अच्छा है।

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


5

XML विशेषता का उपयोग करके आपको केवल एक वर्ग के बजाय एक विधि को परिभाषित करने की आवश्यकता है इसलिए मैं सोच रहा था कि क्या कोड के माध्यम से ही किया जा सकता है और XML लेआउट में नहीं।

हाँ, आप अपना fragmentया बना सकते हैंactivity कार्यान्वितView.OnClickListener

और जब आप कोड में अपने नए दृश्य ऑब्जेक्ट को इनिशियलाइज़ करते हैं तो आप बस कर सकते हैं mView.setOnClickListener(this);

और यह स्वचालित रूप से onClick(View v)आपके fragmentया उस विधि का उपयोग करने के लिए कोड में सभी दृश्य ऑब्जेक्ट सेट करता हैactivity आदि के पास है।

यह देखने के लिए कि किस onClickविधि ने विधि को बुलाया है , आप स्विच विवरण का उपयोग कर सकते हैंv.getId() विधि ।

यह उत्तर "कोड के माध्यम से संभव नहीं है" कहे जाने वाले से अलग है


4
   Add Button in xml and give onclick attribute name that is the name of Method.
   <!--xml --!>
   <Button
  android:id="@+id/btn_register"
  android:layout_margin="1dp"
  android:onClick="addNumber"
  android:text="Add"
  />


    Button btnAdd = (Button) findViewById(R.id.mybutton); btnAdd.setOnClickListener(new View.OnClickListener() {
   @Override
    public void onClick(View v) {
      addNumber(v);
    }
    });

  Private void addNumber(View v){
  //Logic implement 
    switch (v.getId()) {
    case R.id.btnAdd :
        break;
     default:
        break;
    }}

3

रुइवो के जवाब का समर्थन करते हुए, हाँ, आपको एंड्रॉइड के एक्सएमएल ऑन्ग्लिक में उपयोग करने में सक्षम होने के लिए "सार्वजनिक" के रूप में विधि की घोषणा करनी होगी - मैं एपीआई स्तर 8 (minSdk ...) से 16 (targetSdk ...) को लक्षित करने वाला एक ऐप विकसित कर रहा हूं।

मैं अपने तरीके को निजी घोषित कर रहा था और इसमें त्रुटि हुई, बस इसे सार्वजनिक काम के रूप में घोषित किया।


ऐसा प्रतीत होता है कि होस्टिंग गतिविधि के वर्ग में घोषित चर का उपयोग घोषित कॉलबैक के दायरे में नहीं किया जा सकता है; बंडल गतिविधि ..mundle myFancyMethod () में उपयोग किए जाने पर IllegalStateException / NullPointerException को फेंक देगा।
क्वासौर

2

सावधान रहें, हालाँकि android:onClickXML क्लिक को संभालने का एक सुविधाजनक तरीका लगता है, setOnClickListenerकार्यान्वयन कार्यान्वयन को जोड़ने से कुछ अतिरिक्त करता है onClickListener। वास्तव में, इसने दृश्य संपत्ति clickableको सत्य बना दिया।

हालांकि यह अधिकांश एंड्रॉइड कार्यान्वयनों पर एक समस्या नहीं हो सकती है, फोन निर्माता के अनुसार, बटन हमेशा क्लिक करने योग्य = सत्य के लिए डिफ़ॉल्ट होता है, लेकिन कुछ फोन मॉडल पर अन्य निर्माणकर्ताओं के पास गैर बटन दृश्यों पर डिफ़ॉल्ट क्लिक करने योग्य = गलत हो सकता है।

तो XML को सेट करना पर्याप्त नहीं है, आपको जोड़ने के लिए हर समय सोचना होगा android:clickable="true" नॉन बटन पर , और यदि आपके पास कोई ऐसा डिवाइस है जहां डिफ़ॉल्ट क्लिक करने योग्य है = सत्य है और आप इस XML विशेषता को डालने के लिए एक बार भी भूल जाते हैं, तो आप ध्यान नहीं देंगे रनटाइम पर समस्या लेकिन बाजार पर प्रतिक्रिया तब मिलेगी जब यह आपके ग्राहकों के हाथों में होगा!

इसके अलावा, हम कभी भी इस बारे में निश्चित नहीं हो सकते हैं कि प्रीडग एक्सएमएल विशेषताओं और वर्ग विधि को कैसे बाधित और नाम बदलेगा, इसलिए 100% सुरक्षित नहीं है कि उनके पास एक दिन बग नहीं होगा।

इसलिए यदि आप कभी परेशान नहीं होना चाहते हैं और इसके बारे में कभी नहीं सोचते हैं, तो setOnClickListenerएनोटेशन के साथ बटरकॉइन जैसी लाइब्रेरियों का उपयोग करना बेहतर है।@OnClick(R.id.button)


onClickXML विशेषता भी सेट clickable = trueक्योंकि यह कॉल setOnClickListenerपर Viewआंतरिक रूप से
फ्लोरियन वाल्थर

1

मान लीजिए, आप क्लिक इवेंट को इस तरह जोड़ना चाहते हैं main.xml

<Button
    android:id="@+id/btn_register"
    android:layout_margin="1dp"
    android:layout_marginLeft="3dp"
    android:layout_marginTop="10dp"
    android:layout_weight="2"
    android:onClick="register"
    android:text="Register"
    android:textColor="#000000"/>

जावा फ़ाइल में, आपको इस विधि की तरह एक विधि लिखना होगा।

public void register(View view) {
}

0

मैं इस कोड को xml फ़ाइल में लिख रहा हूँ ...

<Button
    android:id="@+id/btn_register"
    android:layout_margin="1dp"
    android:layout_marginLeft="3dp"
    android:layout_marginTop="10dp"
    android:layout_weight="2"
    android:onClick="register"
    android:text="Register"
    android:textColor="#000000"/>

और इस कोड को टुकड़े में लिखें ...

public void register(View view) {
}

यह टुकड़े में संभव है।
user2786249

0

ऐसा करने का सबसे अच्छा तरीका निम्नलिखित कोड है:

 Button button = (Button)findViewById(R.id.btn_register);
 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //do your fancy method
            }
        });

मैं यह नहीं देखता कि यह सवाल का जवाब कैसे देता है - पूछने वाला अनाम वर्ग बनाने से बचना चाहता है, और इसके बजाय एक वर्ग विधि का उपयोग करता है।
अंजोर्ट

0

अपने जीवन को आसान बनाने के लिए और setOnClicklistener () में अनाम वर्ग से बचने के लिए, नीचे एक View.OnClicklistener इंटरफ़ेस लागू करें:

सार्वजनिक वर्ग YourClass कॉमनएक्टिविटी लागू करता है View.OnClickListener, ...

इससे बचा जाता है:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        yourMethod(v);
    }
});

और सीधे जाता है:

@Override
public void onClick(View v) {
  switch (v.getId()) {
    case R.id.your_view:
      yourMethod();
      break;
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.