एकाधिक बटन 'OnClickListener () Android


85

मैं वर्तमान में एंड्रॉइड पर एक साधारण कैलकुलेटर ऐप बना रहा हूं। Im कोड सेट करने की कोशिश कर रहा है ताकि जब कोई नंबर बटन दबाया जाए तो वह उस नंबर के साथ कैलकुलेटर स्क्रीन को अपडेट करे। वर्तमान में मैं इसे इस तरह कर रहा हूं।

    Button one = (Button) findViewById(R.id.oneButton);
    one.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            TextView output = (TextView) findViewById(R.id.output);
            output.append("1");
        }
    });

यह काम करता है लेकिन मैं कैलकुलेटर पर हर एक बटन के लिए एक ही कोड लिख रहा हूं। जैसा कि आप कल्पना कर सकते हैं कि यह बहुत बेमानी है। वैसे भी क्या मैं इस कोड को अधिक कुशल तरीके से लिख सकता हूं? एक जिसमें हर एक बटन के लिए यह विधि नहीं लिखना शामिल है?


अपनी कक्षा में ऑनक्लिक श्रोता को लागू करें, यह ऑनक्लिक विधि को ओवरराइड कर देगा। बटन आईडी पर आधारित आप ऑपरेशन कर सकते हैं
शिक्षार्थी

Boopathi, क्या आप इस बारे में अधिक बता सकते हैं कि मैं फिर एक बटन को कैसे कोड करूंगा? मैंने बटन आईडी "1" बनाया जिस तरह से मैं नंबर का उपयोग करने के लिए "इस" का उपयोग कर सकता हूं। मुझे यकीन नहीं है कि फिर मैं TextView को कैसे संपादित करूंगा।
user3011685

जवाबों:


242

यू जस्ट बस इसे आसान बनाने के लिए इन चरणों का पालन करना होगा ...

आपको onClickListenerहर Button... के लिए नया लिखना नहीं है ... बस View.OnClickListerअपने पर लागू करें Activity/ Fragment.. यह नए तरीकों को लागू करने के onClick()लिए बुलाया जाएगा Button

  1. OnClickListener()अपने में लागू करें Activity/Fragment
public class MainActivity extends Activity implements View.OnClickListener {

}
  1. अपनी गतिविधि / प्रसार में onClick () पद्धति को लागू करें
public class MainActivity extends Activity implements View.OnClickListener {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    @Override
    public void onClick(View v) {
      // default method for handling onClick Events..
    }
}
  1. OnClickListener()बटन के लिए लागू करें
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    setContentView(R.layout.your_layout);
    
    Button one = (Button) findViewById(R.id.oneButton);
    one.setOnClickListener(this); // calling onClick() method
    Button two = (Button) findViewById(R.id.twoButton);
    two.setOnClickListener(this);
    Button three = (Button) findViewById(R.id.threeButton);
    three.setOnClickListener(this);
}
  1. आईडी द्वारा बटन खोजें और अपना कोड लागू करें ..
@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.oneButton:
            // do your code
            break;
        case R.id.twoButton:
            // do your code
            break;
        case R.id.threeButton:
            // do your code
            break;
        default:
            break;
    }
}

अधिक जानकारी के लिए कृपया इस लिंक को देखें:

https://androidacademy.blogspot.com/2016/12/multiple-buttons-onclicklistener-android.html (अद्यतन)

यह कई बटन क्लिक घटनाओं को संभालने के लिए आसान बना देगा और इसे प्रबंधित करने के लिए सरल लगता है ...


बिंदु 4: मुझे @ ऑवरराइड टैग पर त्रुटि हो रही है जो मुझे चेतावनी देता है कि यह विधि सुपरक्लास से इसकी विधि को ओवरराइड नहीं करती है।
कसपरट

@ user2984127 किस मामले के लिए? क्या आप इसे खंड या गतिविधि के साथ उपयोग कर रहे हैं?
प्रज्ञानेश घोड़ा esh

@ user2984127 View.OnClickListener को लागू करने का प्रयास करें।
प्रज्ञानेश घोड़ा

मैंने ग्रहण करते समय कई बार इस पद्धति का उपयोग किया था, लेकिन अब मैं एंड्रॉइड स्टूडियो में बदल गया और मुझे एक त्रुटि मिली "एंड्रॉइड लाइब्रेरी मॉड्यूल में स्विच स्टेटमेंट में संसाधन आईडी का उपयोग नहीं किया जा सकता है।" एसडीके टूल आर 14 के रूप में संसाधन आईडी अंतिम नहीं हैं। अनुशंसित फिक्स स्विच को प्रतिस्थापित करने के लिए है अगर / और कथनों के साथ।
वृश्चिक

@ स्कोर्पियो: मैं एंड्रॉइड स्टूडियो का भी उपयोग कर रहा हूं। लेकिन मुझे वह त्रुटि कभी नहीं मिली। कृपया जांच लें कि आप उचित तरीकों का उपयोग कर रहे हैं और उपयोग करने के साथ view.getId(), आपको क्लिक किए गए बटन की आईडी मिल रही है। यह एक उदाहरण है, आपने कुछ बदलाव किए हैं जो आपकी जरूरत पर निर्भर करता है। चीयर्स। :)
प्रग्नेश घोड़ा

53

आप संपत्ति सेट कर सकते हैं:

android:onClick="buttonClicked"

उन बटनों में से प्रत्येक के लिए xml फ़ाइल में, और जावा कोड में इसका उपयोग करें:

public void buttonClicked(View view) {

    if (view.getId() == R.id.button1) {
        // button1 action
    } else if (view.getId() == R.id.button2) {
        //button2 action
    } else if (view.getId() == R.id.button3) {
        //button3 action
    }

}

4
स्विच का उपयोग करने के लिए बेहतर है
अली खाकी

1
@ आलियाकी switchकुछ मामलों में काम नहीं कर सकती है। यहां बताया गया: tools.android.com/tips/non-constant-fields
Andro

8

प्रत्येक बटन पर एक टैग सेट करें जिसके साथ आप काम करना चाहते हैं, इस मामले में शायद एक पूर्णांक। फिर आपको अपने सभी बटनों के लिए केवल एक OnClickListener की आवश्यकता है:

Button one = (Button) findViewById(R.id.oneButton);
Button two = (Button) findViewById(R.id.twoButton);
one.setTag(new Integer(1));
two.setTag(new Integer(2));

OnClickListener onClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        TextView output = (TextView) findViewById(R.id.output);
        output.append(v.getTag());
    }
}

one.setOnClickListener(onClickListener);
two.setOnClickListener(onClickListener);

1
टैग के लिए टैग का उपयोग करने के लिए इस उत्तर को भी देखें
हेनरिक क्रिस्टेंसन

8

मैंने समर्पित वर्ग बनाया जो View.OnClickListener को लागू करता है।

public class ButtonClickListener implements View.OnClickListener {

    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_SHORT).show();
    }

}

फिर, मैंने इस क्लास का मेनएक्टिविटी में एक उदाहरण बनाया

private ButtonClickListener onClickBtnListener = new ButtonClickListener();

और फिर बटन के लिए onClickListener सेट करें

btn.setOnClickListener(onClickBtnListener);

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

मैं मान रहा हूँ यदि आप प्रति बटन एक वर्ग उदाहरण बनाते हैं जो इस चिंता को भी कम करेगा
मैट स्ट्रॉम

3
public class MainActivity extends AppCompatActivity implements OnClickListener  {
    Button  b1,b2;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1= (Button) findViewById(R.id.button);
        b2= (Button) findViewById(R.id.button2);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);
    }


    @Override
    public void onClick(View v)
    {
        if(v.getId()==R.id.button)
        {
            Intent intent=new Intent(getApplicationContext(),SignIn.class);
            startActivity(intent);
        }
        else if (v.getId()==R.id.button2)
        {
            Intent in=new Intent(getApplicationContext(),SignUpactivity.class);
            startActivity(in);
        }
    }
}

1

मेरे पास एक समान मुद्दा था और मैंने जो किया वह है: बटनों की एक सरणी बनाएं

Button buttons[] = new Button[10];

फिर क्लिक श्रोता और संदर्भ पर लागू करने के लिए xml आईडी के I ने इस तरह एक लूप का उपयोग किया

for (int i = 0; i < 10; i++) {      
String buttonID = "button" + i;
        int resID = getResources().getIdentifier(buttonID, "id",
                "your package name here");
        buttons[i] = (Button) findViewById(resID);
        buttons[i].setOnClickListener(this);
    }

लेकिन उन्हें कॉल करना प्राग के उत्तर बिंदु 4 में समान रहता है। PS- यदि किसी के पास बटन के सभी ऑनकिक को कॉल करने का एक बेहतर तरीका है, तो कृपया टिप्पणी करें।


1
public void onClick(View v) {
    int id = v.getId();
    switch (id){
        case R.id.button1:
            //do ur code
            Toast.makeText(this,"This is button 1",Toast.LENGTH_SHORT).show();
            break;
        case R.id.button2:
            Intent intent = new Intent(this,SecondActivity.class);
            Intent.putExtra("key",value);
            startActivity(intent);
            break;
        case R.id.button3:
            //do ur code
            break;
        case R.id.button4:
            //do ur code;
            break;
        default:
            //do ur code;
    }
}

1

आप इसका उपयोग कर सकते हैं

    TextView output = (TextView) findViewById(R.id.output);
    one.setOnClickListener(youractivity.this);
    // set the onclicklistener for other buttons also

    @Override
    public void onClick(View v) {
      int id = v.getId();
    switch(id) {
    case R.id.oneButton:      
       append("1",output);
       break;
    case R.id.twoButton:
        append("2",output);
       break;
    case R.id.threeButton:
        append("3",output);
       break;
     } 
      }

 private void append(String s,TextView t){
  t.setText(s); 
}

आप एक अलग विधि में अपनी गतिविधि में विचारों की पहचान कर सकते हैं।


1

अपनी गतिविधि पर लागू करेंक्लिक करें () विधि / फ़्रैग्मेंट सार्वजनिक वर्ग में मुख्य गतिविधि सक्रियता को बढ़ाती है

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onClick(View v) {
 switch (itemId) {

// if you call the fragment with nevigation bar then used.

           case R.id.nav_menu1:
                fragment = new IntroductionFragment();
                break;

// if call activity with nevigation bar then used.

            case R.id.nav_menu6:
                Intent i = new Intent(MainActivity.this, YoutubeActivity.class);
                startActivity(i);
      // default method for handling onClick Events..
    }
}

0

मुझे लगता है कि एक लंबी अगर / अन्यथा श्रृंखला (या स्विच) का उपयोग करना, findViewById(btn).setOnClickListener(this)बदसूरत की सूची के अलावा है। ओवरराइड, इन-लाइन के साथ नए View.OnlickListeners बनाने के बारे में कैसे:

findViewById(R.id.signInButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { signIn(); }});
findViewById(R.id.signOutButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { signOut(); }});
findViewById(R.id.keyTestButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { decryptThisTest(); }});
findViewById(R.id.getBkTicksButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { getBookTickers(); }});
findViewById(R.id.getBalsButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { getBalances(); }});

0

कोई और की जरूरत नहीं है या स्विच, चलो शुरू करें: अपने हर बटन में या जो कुछ भी है (मैं ImageView का उपयोग कर रहा हूं), इस विशेषता को जोड़ें android:onClick="DoSomeThing"

आपकी गतिविधि में:

public void DoSomeThing(View v){
    ImageView img1= (ImageView) v; //you have to cast the view i.e. if it's button, it must be cast to Button like below line

    Button b1= (Button) v;

    img1.setImageBitmap(imageBitmap); //or anything you want to do with your view, This will work for all

    b1.setText("Some Text");
 

}

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