Android按钮setOnClickListener设计

use*_*162 45 android design-patterns button onclicklistener

我正在构建一个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}
    } 
});
Run Code Online (Sandbox Code Playgroud)

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

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

如果有人知道任何事情,我会很感激.

dgm*_*ltn 53

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

<Button 
   android:height="wrap_content"
   android:width="wrap_content"
   android:onClick="myClickHandler" />
Run Code Online (Sandbox Code Playgroud)

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

class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)


Squ*_*onk 27

在您的Activity上实现OnClickListener()...

public class MyActivity extends Activity implements View.OnClickListener {
}
Run Code Online (Sandbox Code Playgroud)

对于每个按钮使用...

buttonX.setOnClickListener(this);
Run Code Online (Sandbox Code Playgroud)

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

@Override
public void onClick(View view) {
    if (View.equals(buttonX))
        // Do something
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这真的是一种改善吗? (6认同)
  • @Corey Sunwold:这一切都很主观但是使用了setOnClickListener(this); 通过不使用内联onClick()声明来减少代码的按钮创建部分.只有一个onCLick()代码块,特别是使用开关/案例代码块来识别按下哪个按钮,可以在主代码的单独区域中进行简单的测试.更重要的是,每个'case'都可以简单地在位于其他地方的'helper'类中调用一个方法.我可以想到另一种方式或两种做法,但代码仍然必须去某个地方. (3认同)

Ily*_*man 11

Android lambada解决方案

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());
}
Run Code Online (Sandbox Code Playgroud)

Switch案例解决方案

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;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)


Jim*_*ler 10

由于setOnClickListener上定义ViewButton,如果你不需要为别的变量,你可以把一个小更简洁这样的:

findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});
Run Code Online (Sandbox Code Playgroud)


小智 6

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

Button btn[] = new Button[n]; 
Run Code Online (Sandbox Code Playgroud)

注意: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.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:首先编写一个main.xml文件如果您不知道如何编写,请发送邮件至:wesagnd@yahoo.com