在android的布局中按钮的通用监听器?

时间:2010-10-12 10:40:46

标签: android

场景:我在xml中定义了三个按钮

<button android:id="@+id/firstbtn" 
    ...
/>
<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();  
            }  
        });  

对于第二个btn,相同的代码必须以不同的id重复 我怎样才能使它足够通用,它可以听取所有按钮(比如for循环),而在处理时我应该能够区分不同的btns。 (可能是获取元素ID)

4 个答案:

答案 0 :(得分:8)

我更喜欢使用findViewById xml属性而不是大量onClick="methodName"次调用。例如:

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

在显示布局的活动中,只需添加方法

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

您还可以将onClick和clickable属性放入res / styles.xml文件以节省更多输入:

<?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>

然后将您的布局简化为

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

答案 1 :(得分:6)

您无需为所有人​​重复相同的代码。您可以尝试使用通用侦听器,例如:

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

然后,您只需注册所有三个按钮即可使用此mCorkyListener。 也就是说,在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);

答案 2 :(得分:1)

查看here代码示例。你必须使用findViewById“找到”你的按钮。

答案 3 :(得分:0)

您只需遵循以下步骤即可简化操作...

您不必为每个按钮编写新的onClickListener ...只需在您的Activity / Fragment中实现View.OnClickLister。它将实现一个名为onClick()的新方法,用于处理Button,TextView等的onClick事件。 / p>

活动/片段中的1-Implement OnClickListener()

   public class MainActivity extends Activity implements View.OnClickListener {
    } 
Activity / Fragment中的

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

按钮的3实现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);
        }

按ID查找4个按钮并实现您的代码

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