Android按钮setOnClickListener设计

时间:2011-04-07 23:30:07

标签: android button design-patterns 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}
    } 
});

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

  1. 创建按钮对象{Button buttonX (Button)findViewById(R.id.buttonXName);}
  2. 设置监听器{buttonX.setOnClickListener(new OnClickListener()}
  3. 确定是否点击了{public void onClick(View v)}
  4. 然后为每个按钮运行特定代码?
  5. 如果有人知道,我会很感激。

9 个答案:

答案 0 :(得分:49)

如果您的目标是1.6或更高版本,则可以使用android:onClick xml attribute删除部分重复代码。请参阅Romain Guy的this blog post

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

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

class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}

答案 1 :(得分:26)

在您的活动上实施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,然后在开关/案例块中使用它来识别每个按钮并执行相关操作。

答案 2 :(得分:10)

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

交换机案例解决方案

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

答案 3 :(得分:9)

由于在setOnClickListener而不是View上定义了Button,如果您不需要其他内容的变量,那么您可以将它变成这样的一点点:

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

答案 4 :(得分: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

答案 5 :(得分:3)

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

查看this answer,了解如何针对类似问题使用循环。如何构建循环将取决于onClick函数的需求以及它们彼此之间的相似程度。最终结果是重复性更低的代码更容易维护。

答案 6 :(得分: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();
    }

}

答案 7 :(得分:1)

使用View.OnClickListener实施活动,如下所示。

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;

        }

    }

}

答案 8 :(得分:1)

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;

        }

    }

}