50

我正在构建一个 Android 应用程序。我注意到我在每个类中都创建了许多与此类似的代码重复:

Button buttonX = (Button)findViewById(R.id.buttonXName);
// Register the onClick listener with the implementation above
buttonX.setOnClickListener(new OnClickListener() {
    public void onClick(View v)
    {
        //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});

我现在有十五个按钮,这使我的代码变得丑陋。有没有人有关于如何将所有这些代码变成更高效的课程或一些示例,所以我可以:

  1. 创建按钮对象{Button buttonX (Button)findViewById(R.id.buttonXName);}
  2. 设置监听器{buttonX.setOnClickListener(new OnClickListener()}
  3. 判断是否被点击{public void onClick(View v)}
  4. 然后为每个按钮运行特定的代码?

如果有人知道什么,我将不胜感激。

4

9 回答 9

58

如果您的目标是 1.6 或更高版本,您可以使用android:onClick xml 属性来删除一些重复的代码。请参阅Romain Guy 的这篇博文。

<Button 
   android:height="wrap_content"
   android:width="wrap_content"
   android:onClick="myClickHandler" />

在 Java 类中,使用以下代码行:

class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}
于 2011-04-07T23:52:21.627 回答
28

在您的活动上实施 OnClickListener() ...

public class MyActivity extends Activity implements View.OnClickListener {
}

对于每个按钮使用...

buttonX.setOnClickListener(this);

在您的 Activity onClick() 方法中测试它是哪个按钮...

@Override
public void onClick(View view) {
    if (View.equals(buttonX))
        // Do something
}

同样在 onClick 中,您可以使用 view.getId() 来获取资源 ID,然后在 switch/case 块中使用它来识别每个按钮并执行相关操作。

于 2011-04-07T23:47:21.527 回答
14

安卓兰巴达解决方案

public void registerButtons(){
    register(R.id.buttonName1, ()-> {/*Your code goes here*/});
    register(R.id.buttonName2, ()-> {/*Your code goes here*/});
    register(R.id.buttonName3, ()-> {/*Your code goes here*/});
}

private void register(int buttonResourceId, Runnable r){
    findViewById(buttonResourceId).setOnClickListener(v -> r.run());
}

开关盒解决方案

public void registerButtons(){
    register(R.id.buttonName1);
    register(R.id.buttonName2);
    register(R.id.buttonName3);
}

private void register(int buttonResourceId){
    findViewById(buttonResourceId).setOnClickListener(buttonClickListener);
}

private OnClickListener buttonClickListener = new OnClickListener() {

    @Override
    public void onClick(View v){
        switch (v.getId()) {
            case R.id.buttonName1:
                // TODO Auto-generated method stub
                break;
            case R.id.buttonName2:
                // TODO Auto-generated method stub
                break;
            case View.NO_ID:
            default:
                // TODO Auto-generated method stub
                break;
        }
    }
};
于 2013-05-07T19:16:36.650 回答
10

由于在notsetOnClickListener上定义,如果您不需要其他变量,您可以像这样使它更简洁:ViewButton

findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});
于 2011-04-07T23:49:39.347 回答
6

您可以使用数组来处理 android 中的多个按钮单击侦听器,如下所示:这里我通过使用数组为 n 个按钮设置按钮单击侦听器:

Button btn[] = new Button[n]; 

注意:n 是一个常数正整数

代码示例:

//class androidMultipleButtonActions 
package a.b.c.app;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class androidMultipleButtonActions extends Activity implements OnClickListener{
    Button btn[] = new Button[3];

    public void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        btn[0] = (Button) findViewById(R.id.Button1);
        btn[1] = (Button) findViewById(R.id.Button2);
        btn[2] = (Button) findViewById(R.id.Button3);
        for(int i=0; i<3; i++){
            btn[i].setOnClickListener(this);
        }           
    }

    public void onClick(View v) {
        if(v == findViewById(R.id.Button1)){
            //do here what u wanna do.
        }
        else if(v == findViewById(R.id.Button2)){
            //do here what u wanna do.
        }
        else if(v == findViewById(R.id.Button3)){
            //do here what u wanna do.
        }
    }
}

注意:先写一个main.xml文件,如果你不知道怎么写请发邮件到:wesagnd@yahoo.com

于 2012-05-25T21:20:45.937 回答
3

我认为你通常可以在一个循环中做你需要的事情,如果可以做到的话,这比许多onClick方法要好得多。

查看此答案以演示如何使用循环来解决类似问题。你如何构建你的循环将取决于你的onClick函数的需求以及它们之间的相似程度。最终结果是更少重复的代码,更易于维护。

于 2011-04-08T02:32:53.023 回答
2

View.OnClickListener像下面这样实现 Activity 。

public class MyActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_options);

        Button button = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);

        button.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        int id = view.getId();

        switch (id) {

            case R.id.button:

                  // Write your code here first button

                break;

             case R.id.button2:

                  // Write your code here for second button

                break;

        }

    }

}
于 2018-02-09T05:25:56.590 回答
2
public class MyActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_options);

        Button button = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);

        button.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        int id = view.getId();

        switch (id) {

            case R.id.button:

                  // Write your code here first button

                break;

             case R.id.button2:

                  // Write your code here for second button

                break;

        }

    }

}
于 2018-05-17T07:03:28.880 回答
1
public class MainActivity extends AppCompatActivity  implements View.OnClickListener{

    Button b1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1=(Button)findViewById(R.id.button);
        b1.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(),"Button is Working",Toast.LENGTH_LONG).show();
    }

}
于 2015-12-06T10:46:58.233 回答