开发者

generic listener for buttons in a layout of android?

Scenario: I have three buttons defined in xml

<button android:id="@+id/firs开发者_StackOverflowtbtn" 
    ...
/>
<button android:id="@+id/secbtn" 
    ...
/>
<button android:id="@+id/thirdbtn" 
    ...
/>
In Java one way to  listen to them is  
Button firstbtn = (Button) findViewById(R.id.firstbtn);  
    firstbtn.setOnClickListener(new View.OnClickListener() {  
            public void onClick(View v) {  
                Toast.makeText(getBaseContext(),   
                        "You have clicked first button",   
                        Toast.LENGTH_SHORT).show();  
            }  
        });  

for second btn , same code has to be repeated with different id ??

How can I make it generic enough that , it can listen to all buttons (say in for loop) and while handling I should be able to differentiate different btns. (may be get elements id)


Instead of a huge set of findViewById calls I rather like to use the onClick="methodName" xml attribute. For example:

<LinearLayout ...>
  <Button android:text="1" onClick="onButtonClicked" clickable="true" />
  <Button android:text="2" onClick="onButtonClicked" clickable="true" />
  <Button android:text="3" onClick="onButtonClicked" clickable="true" />
  <Button android:text="4" onClick="onButtonClicked" clickable="true" />
</LinearLayout>

In the activity where the layout is shown just add a method

public void onButtonClicked(View v){
     // do whatever needs to be done. For example:
     Toast.makeText(getApplicationContext(), ((Button) v).getText() + " clicked", Toast.LENGTH_SHORT).show(); 
}

You can also put the onClick and clickable attributes into the res/styles.xml file to save even more typing:

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
  <style name="clickable_button" >
    <item name="android:onClick" >onButtonClicked</item>
    <item name="android:clickable" >true</item>
  </style>
</resources>

Your layout is then simplified to

<LinearLayout ...>
  <Button android:text="1" style="@style/clickable_button" />
  <Button android:text="2" style="@style/clickable_button" />
  <Button android:text="3" style="@style/clickable_button" />
  <Button android:text="4" style="@style/clickable_button" />
</LinearLayout>


You need not repeat same code for all. You can try out a generic listener, like :

private OnClickListener mCorkyListener = new OnClickListener() { 
    public void Click(View v) {
            // do something
    } 
}; 

Then all you have to do is register all three buttons to use this mCorkyListener. That is, inside onCreate(),

Button firstbtn  = (Button) findViewById(R.id.firstbtn); 
Button secondbtn = (Button) findViewById(R.id.secondbtn); 
Button thirdbtn  = (Button) findViewById(R.id.thirdbtn); 

firstbtn.setOnClickListener(mCorkyListener);
secondbtn.setOnClickListener(mCorkyListener);
thirdbtn.setOnClickListener(mCorkyListener);


Look here for code samples. You have to use findViewById to "find" you r buttons though.


You Just Simply have to Follow these steps for making it easy...

You don't have to write new onClickListener for Every Button... Just Implement View.OnClickLister to your Activity/Fragment.. it will implement new Method called onClick() for handling onClick Events for Button,TextView etc.

1-Implement OnClickListener() in your Activity/Fragment

   public class MainActivity extends Activity implements View.OnClickListener {
    } 

2-Implement onClick() method in your Activity/Fragment

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

3-Implement OnClickListener() For Buttons

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

4-Find Buttons By Id and Implement Your Code

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜