অ্যান্ড্রয়েড অনক্লিকলিস্টনার - একটি বোতাম সনাক্ত করুন


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
একাধিক বোতামের জন্য
অনক্লিকলিস্টনার

উত্তর:


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। মনে রাখবেন যে এটি করার দ্বিতীয় উপায়টি প্রস্তাবিত নয় ... সম্ভবত সেই ভি কোনও বোতাম নাও হতে পারে যা একটি কাস্ট ব্যতিক্রম উত্পন্ন করবে।
ক্রিশ্চিয়ান

2
আসলে উভয় উপায় পরামর্শ দেওয়া হয় না, আমার উত্তর দেখার
ognian

তার প্রতিস্থাপন করতে আসলে বেশ সহজ যদি, একটি একক সুইচ ক্ষেত্রে বিবৃতি যে আপনি দেখুন আইডি সুইচ এবং মামলা R.java থেকে ID এর সাথে ফাঁদে
Slayton

আপনি যেভাবেই বা কেন একটি বোতামে ভি কাস্ট করছেন তা ভাবছেন। getId () এর সাথে সংখ্যার সংজ্ঞা দেওয়া হয়েছে। অতএব আমি সত্যিই দ্বিতীয় পদ্ধতিটি সুপারিশ করব না তবে খ্রিস্টানের সমাধানটিকে পছন্দ করব!
নুয়াল

77

অথবা আপনি একই চেষ্টা করতে পারেন তবে শ্রোতা ছাড়া। আপনার বোতামে এক্সএমএল সংজ্ঞা:

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
একটি আকর্ষণীয় ভিন্ন পদ্ধতির সময়, শ্রোতাদের জন্য এক্সএমএল হুকগুলি গুলিগুলির কোণগুলির চারপাশে মোটামুটি Fragment, কারণ কলব্যাক অবশ্যই ক্রিয়াকলাপে থাকতে হবে (খণ্ড নয়)।
donfede

আমার প্রোবটি ডোসোমিংথিং 2 () কন্টেন্টের কাছে পৌঁছে যাবে না কোনও ইনভোকেশনট্রেটএক্সসেপশন বা একটি নলপয়েন্টারএক্সসেপশন (বা উভয়)।
কায়সৌর

1
কেবলমাত্র একটি পার্থক্য: এখানে "শ্রোতাবিহীন" বক্তব্যটি ভুল। আপনি কেবল এক্সএমএলে শ্রোতাকেই ঘোষণা করছেন, এগুলিই।
হুবার্ট গ্রেজস্কোইয়াক

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;
            }
        }
    };
}

৩. নামবিহীন অভ্যন্তর শ্রেণি

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
            }
        });
    }
}

৪. ক্রিয়াকলাপে বাস্তবায়ন

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;
        }
    }
}

৫. অনক্লিক ইভেন্টগুলির জন্য ভিউ লেআউটে বৈশিষ্ট্য

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;
        }
    }
}

এবং এক্সএমএলে:

<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;
        }
    }
}

আমি স্যুইচ-অন্যটির পরিবর্তে একক আইএফ দিয়ে এটি করতে পছন্দ করি তবে আপনি যদি এটি পছন্দ করেন তবে আপনার করা উচিত:

//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 () এর মধ্যে বাই বাইং। প্রতিটি বোতামের জন্য পৃথক বেনামে অনিক্লিকলিস্টার রাখা আরও মেমরি গ্রহণ করে। বাটনে ভিউ কাস্ট করা অপ্রয়োজনীয়। যদি স্যুইচ সম্ভব হয় তবে-অন্যটি ব্যবহার করা ধীরে ধীরে পড়া এবং আরও শক্ত। অ্যান্ড্রয়েডের উত্সে আপনি প্রায়শই যদি-অন্যটি দ্বারা রেফারেন্সগুলি তুলনা করতে লক্ষ্য করতে পারেন:

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

আমি কেন জানি না কেন তারা এই উপায়টি বেছে নিল, তবে এটি কার্যকরও হয়।


কারণ v14 যেহেতু আইডিগুলি ধ্রুবক হিসাবে চিকিত্সা করা হয় না সেহেতু এটি আর সম্ভব নয়
ব্যবহারকারী 1324936

@ জ্ঞানবিদ আমি এখানে অবধি অনুসরণ করেছি কারণ আপনি বলেছিলেন যে মূল উত্তরটি হ্রাস করা পদ্ধতির ব্যবহার করে। আজকাল অ্যান্ড্রয়েড 5.0 ললিপপ প্রকাশিত হয়ে, আপনার উত্তরটি কি এখনও সত্য, বা সময় কী এটিকে অস্পষ্ট করে তুলেছে, উপরের মন্তব্যটির মতো? এখান থেকে কী ভাবতে হবে, বা কোন দিক নিতে হবে তা আমি সত্যিই জানি না।
SebasSBM

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

ক্রিশ্চিয়ান সি এর উত্তর ছাড়াও (দুঃখিত, আমার কাছে মন্তব্য করার ক্ষমতা নেই), আপনি যদি উভয় বোতামের জন্য একটি হ্যান্ডলার তৈরি করেন তবে আপনি সরাসরি ভি 1 এবং বি 2 এর সাথে তুলনা করতে পারেন, বা আপনি যদি আইডি দ্বারা তুলনা করতে চান তবে আপনি বাটনে ভি কাস্ট করার দরকার নেই (দেখুন getId () পদ্ধতিটিও রয়েছে), এবং এইভাবে কাস্ট ব্যতিক্রমের কোনও উদ্বেগ নেই।


আরেকটি বিকল্প হ'ল "যদি (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();
    }
}

আরও তথ্যের জন্য এই নিবন্ধটি দেখুন


এটি কম-বেশি বিদ্যমান কয়েকটি উত্তরের পুনরাবৃত্তি।
পাং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.