Android OnClickListener - एक बटन की पहचान करें


134

मेरे पास गतिविधि है:

public class Mtest extends Activity {
  Button b1;
  Button b2;
  public void onCreate(Bundle savedInstanceState) {
    ...
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(myhandler);
    b2.setOnClickListener(myhandler);
    ...
  }
  View.OnClickListener myhandler = new View.OnClickListener() {
    public void onClick(View v) {
      // MY QUESTION STARTS HERE!!!
      // IF b1 do this
      // IF b2 do this
      // MY QUESTION ENDS HERE!!!
    }
  }
}

मैं कैसे जांचूं कि किस बटन पर क्लिक किया गया है?


1
कई बटन के लिए OnClickListeners को जोड़ने के लिए पांच अलग-अलग तरीकों की तुलना
Suragch

जवाबों:


199

आप इसे करने का तरीका जानेंगे, एक आसान तरीके से, यह है:

public class Mtest extends Activity {
  Button b1;
  Button b2;
  public void onCreate(Bundle savedInstanceState) {
    ...
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(myhandler1);
    b2.setOnClickListener(myhandler2);
    ...
  }
  View.OnClickListener myhandler1 = new View.OnClickListener() {
    public void onClick(View v) {
      // it was the 1st button
    }
  };
  View.OnClickListener myhandler2 = new View.OnClickListener() {
    public void onClick(View v) {
      // it was the 2nd button
    }
  };
}

या, यदि आप केवल एक क्लिकलिस्टर के साथ काम कर रहे हैं, तो आप कर सकते हैं:

View.OnClickListener myOnlyhandler = new View.OnClickListener() {
  public void onClick(View v) {
      switch(v.getId()) {
        case R.id.b1:
          // it was the first button
          break;
        case R.id.b2:
          // it was the second button
          break;
      }
  }
}

हालाँकि, मैं इसे इस तरह से करने की सलाह नहीं देता हूँ क्योंकि ifआपके द्वारा उपयोग किए जाने वाले प्रत्येक बटन के लिए आपको जोड़ना होगा । जिसे बनाए रखना कठिन है।


1
खैर, वास्तव में यह सही नहीं है। Viewएक नहीं है Button, लेकिन Buttonएक है View। हालांकि, आप एक Viewसे एक कास्ट कर सकते हैं Button। ध्यान रखें कि इसे करने का दूसरा तरीका अनुशंसित नहीं है ... हो सकता है कि v एक बटन न हो, जो एक कास्ट अपवाद उत्पन्न करेगा।
क्रिस्चियन

2
वास्तव में दोनों तरीकों की सिफारिश नहीं की जाती है, मेरा उत्तर देखें
संज्ञानात्मक

इसका वास्तव में काफी सरल है अगर, एक एकल स्विच केस स्टेटमेंट के साथ समाप्त होता है जिसे आप दृश्य की आईडी पर स्विच करते हैं और मामले R.java से आईडी के हैं
slayton

वैसे भी आप एक बटन के लिए v क्यों डाली सोच रहे हैं। getId () को दृश्यों के लिए भी परिभाषित किया गया है। इसलिए मैं वास्तव में दूसरी विधि की सिफारिश नहीं करता, लेकिन ईसाई समाधान पसंद करता हूं!
नुआल

77

या आप एक ही कोशिश कर सकते हैं लेकिन श्रोताओं के बिना। अपने बटन पर XML परिभाषा:

android:onClick="ButtonOnClick"

और अपने कोड में विधि को परिभाषित करें ButtonOnClick:

public void ButtonOnClick(View v) {
    switch (v.getId()) {
      case R.id.button1:
        doSomething1();
        break;
      case R.id.button2:
        doSomething2();
        break;
      }
}

3
अन्य हैंडलर, ifस्टेटमेंट, और श्रोताओं के एक समूह का उपयोग करने वाले अन्य उत्तरों की तुलना में बहुत अधिक क्लीनर । यदि रनटाइम पर बटन बनाए जाते हैं, तो श्रोता महान होते हैं, लेकिन अक्सर ऐसा नहीं होता है।
डेनिस

6
जबकि एक दिलचस्प अलग दृष्टिकोण, श्रोताओं के लिए XML हुक Fragmentएस के साथ कोनों के आसपास मोटे होते हैं , क्योंकि कॉलबैक को गतिविधि में होना चाहिए (टुकड़ा नहीं)।
डॉनफैड

मेरी संभावना doSomething2 () खिचड़ी को बिना किसी मंगलाचरण के या बिना NullPointerException (या दोनों) के फेंकने तक नहीं पहुंच सकती है।
क्वासौर

1
बस एक विचार: यहाँ "श्रोताओं के बिना" कथन गलत है। आप केवल XML में श्रोता की घोषणा कर रहे हैं, बस।
ह्यूबर्ट ग्रेज्सकोविआक

42

मैं पसंद करता हूं:

class MTest extends Activity implements OnClickListener {
    public void onCreate(Bundle savedInstanceState) {
    ...
    Button b1 = (Button) findViewById(R.id.b1);
    Button b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(this);
    b2.setOnClickListener(this);
    ...
}

और तब:

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.b1:
            ....
            break;
        case R.id.b2:
            ....
            break;
    }   
}

Switch- caseकी तुलना में बनाए रखना आसान है if- elseऔर इस कार्यान्वयन के लिए कई वर्ग चर बनाने की आवश्यकता नहीं है।


यह पूरी तरह से काम किया। आपको OnClickListener-android.view.View को लागू करने की आवश्यकता है, न कि OnClickListener-android.content.DialogInterface
gkiko

16

एक ईवेंट श्रोता के लिए पांच तरीके वायर एक एकल ईवेंट श्रोता सेट करने के विभिन्न तरीकों का अवलोकन करने वाला एक शानदार लेख है। मुझे यहाँ कई श्रोताओं के लिए विस्तार करने दें।

1. सदस्य वर्ग

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //attach an instance of HandleClick to the Button
        HandleClick handleClick = new HandleClick();
        findViewById(R.id.button1).setOnClickListener(handleClick);
        findViewById(R.id.button2).setOnClickListener(handleClick);
    }    
    private class HandleClick implements OnClickListener{
        public void onClick(View view) {
            switch(view.getId()) {
            case R.id.button1:
                // do stuff
                break;
            case R.id.button2:
                // do stuff
                break;
            }
        }
    }
}

2. इंटरफ़ेस प्रकार

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button1).setOnClickListener(handleClick);
        findViewById(R.id.button2).setOnClickListener(handleClick);
    }
    private OnClickListener handleClick = new OnClickListener() {
        public void onClick(View view) {
            switch (view.getId()) {
            case R.id.button1:
                // do stuff
                break;
            case R.id.button2:
                // do stuff
                break;
            }
        }
    };
}

3. अनाम आंतरिक वर्ग

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                // do stuff
            }
        });
        findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                // do stuff
            }
        });
    }
}

4. गतिविधि में कार्यान्वयन

public class main extends Activity implements OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
    }
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.button1:
            // do stuff
            break;
        case R.id.button2:
            // do stuff
            break;
        }
    }
}

5. ऑनक्लिक इवेंट्स के लिए व्यू लेआउट में विशेषता

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    public void HandleClick(View view) {
        switch (view.getId()) {
        case R.id.button1:
            // do stuff
            break;
        case R.id.button2:
            // do stuff
            break;
        }
    }
}

और xml में:

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

12

यदि आप वर्ग कोड में 2 बटन के उदाहरणों को सहेजना नहीं चाहते हैं, तो इस बेहतर तरीके से अनुसरण करें (यह अधिक स्पष्ट और तेज़ है !!):

public void buttonPress(View v) {
  switch (v.getId()) {
    case R.id.button_one:
        // do something
        break;
    case R.id.button_two:
        // do something else
        break;
    case R.id.button_three:
        // i'm lazy, do nothing
        break;
  }
}

12

इसे करने का दूसरा तरीका गतिविधि से एकल श्रोता है, जैसे:

public class MyActivity extends Activity implements OnClickListener {
    .......  code

    //my listener
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.mybutton) { 
            DoSomething();
            return;
        }

        if (v.getId() == R.id.mybutton2) { 
            DoSomething2();
            return;
        }
    }
}

मैं इसे स्विच के बजाय IF के साथ करना पसंद करता हूं, लेकिन अगर आप इसे पसंद करते हैं, तो आपको यह करना चाहिए:

//my listener
@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.mybutton:
        { 
             DoSomething();
             break;
        }

        case R.id.mybutton2:
        {
            DoSomething();
            break;
        }
    }
}

9

switchV.getId () के बीच सबसे अच्छा तरीका है- बाइंग। प्रत्येक बटन के लिए अलग अनाम OnClickListener होने से अधिक मेमोरी ली जा रही है। बटन को देखना अनावश्यक है। अगर-और जब स्विच संभव हो तो उपयोग करना धीमा और पढ़ने में कठिन होता है। एंड्रॉइड के स्रोत में आप अक्सर संदर्भों की तुलना अगर-किसी के द्वारा कर सकते हैं:

if (b1 == v) {
 // ...
} else if (b2 == v) {

मुझे नहीं पता कि उन्होंने इस तरह से क्यों चुना, लेकिन यह भी काम करता है।


क्योंकि v14 से अब यह संभव नहीं है जहाँ आईडी का इलाज नहीं किया जाता है
user1324936

@ पहचानकर्ता मैंने यहां तक ​​का अनुसरण किया क्योंकि आपने कहा कि मुख्य उत्तर पदावनत दृष्टिकोण का उपयोग करता है। आजकल एंड्रॉइड 5.0 लॉलीपॉप के साथ जारी किया गया, क्या आपका उत्तर अभी भी सही है, या समय ने इसे एक झूठा बना दिया है, जैसा कि ऊपर दी गई टिप्पणी से पता चलता है? मैं वास्तव में नहीं जानता कि क्या सोचना है, या यहाँ से कौन सी दिशा लेनी है।
सेबास बीएमडब्लू

7

सेटटैग का उपयोग करें ();

इस तरह:

@Override    
public void onClick(View v) {     
    int tag = (Integer) v.getTag();     
    switch (tag) {     
    case 1:     
        System.out.println("button1 click");     
        break;     
    case 2:     
        System.out.println("button2 click");     
       break;   
    }     
}     

मैं एक हैंडलर के लिए अतिरिक्त मापदंडों को पारित करने के लिए एक विधि की तलाश में यहां आया था, यह वही है जो मैं चाहता था। टैग को मार्कअप में घोषित किया जा सकता है।
प्रहरी

4

क्रिस्टियन सी के जवाब के अलावा (क्षमा करें, मेरे पास टिप्पणी करने की क्षमता नहीं है), यदि आप दोनों बटन के लिए एक हैंडलर बनाते हैं, तो आप सीधे v1 से b1 और b2 की तुलना कर सकते हैं, या यदि आप आईडी से तुलना करना चाहते हैं, तो आप बटन को वी करने की आवश्यकता नहीं है (देखें में गेटआईडी () विधि भी है), और इस तरह से कास्ट अपवाद की कोई चिंता नहीं है।


एक अन्य विकल्प "if (v इंस्टोफ बटन) {// बटन को कास्ट करना और यहां सामान देना होगा"
एंडी झांग

4
Button mybutton = new Button(ViewPagerSample.this);
mybutton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
            // TODO Auto-generated method stub
    }
});

1
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(this);

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if(v.getId() == R.id.button1){
        Toast.makeText(context, "Button 1 Click", Toast.LENGTH_LONG).show();
    }
}

अधिक जानकारी के लिए इस लेख की जाँच करें


यह कमोबेश मौजूदा कुछ उत्तरों की पुनरावृत्ति है।
पंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.