4

我在 xml 中设置了 10 个按钮并添加到主要活动中。我只显示 2。所有按钮都只是更改变量和按钮颜色。有没有一种方法可以将所有按钮分组到一个 onclicklistener 并使用 switch 来检查按下了哪个按钮。使用单独的 onclicklistener 似乎分配了很多空间。

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

    f1 =(Button) findViewById(R.id.f1);
    f2 =(Button) findViewById(R.id.f2);

    f1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            clearbutton();
            f1.setBackgroundColor(Color.RED);
            intbtnSelect=0; 
        }
    });

    f2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            clearbutton();
            f2.setBackgroundColor(Color.RED);
            intbtnSelect=1;
        }
    });
4

8 回答 8

8

您可以实施OnClickListener到您的 Activity. 例如

public class MyActivity extends Activity implements View.OnClickListener {       
     @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        f1 =(Button) findViewById(R.id.f1);
        f1.setOnClickListener(this);

        f2 =(Button) findViewById(R.id.f2);
        f2.setOnClickListener(this);
     }
}

他们必须实现 onClick 方法并在 view.getId() 上切换:

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.f1:
        // your code here
        break;
    case R.id.f2:
        // your code here 
        break;
    }
}
于 2013-07-19T13:08:27.980 回答
0

在您的活动中定义一个像这样的全局变量。

private OnClickLister listener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            clearbutton();
            ((Button)v).setBackgroundColor(Color.RED);
            intbtnSelect=v.getTag();


        }
    }

setTag() 数据布局中的每个按钮,如 1-2-3------ 不管

并将此侦听器设置为所有按钮。

f1 =(Button) findViewById(R.id.f1);
f1.setTag(1);
f2 =(Button) findViewById(R.id.f2);
f2.setTag(2);
f1.setOnClickListener(listener);
f2.setOnClickListener(listener);

因此,当您按下按钮时, intbtnSelect 将获取按钮的标签。您不需要从您的活动中实现 View.OnClickListener 。

于 2013-07-19T13:15:45.033 回答
0

在您的 xml 中,在您的所有按钮上:

android:onclick="myClick"

在您的活动中:

public void onClick (View v){
   Button clickedButton = (Button) v;
   //Do wathever you want with your Button
   clickedButton.setBackgroundColor(Color.RED);
   // and you could also switch(v.getId()) if really needed.
}

您也可以按照 blackbelt 的建议实现 View.OnClickListener,这取决于您的偏好。

我个人喜欢保持更简洁的 java 代码,但这取决于你!

我认为这两种方法没有什么好/错。

于 2013-07-19T13:11:04.257 回答
0

让您的 Activity 实现View.OnClickListener,然后您必须添加一个方法onClick(View view)

创建按钮时,您只需添加此行

button.setOnClickListener(this),这样每当单击按钮时,它都会调用onClick()Activity 中的方法。

进入onClick()方法后,您可以使用 view.getId()来查看单击了哪个按钮。

代码 :

// onCreate() - 要么动态创建你的按钮,要么使用 findViewById() 找到它们并分配点击监听器

for(int i = 0; i < MAX_BUTTONS; i++){
    // Create a button here
    button.setOnClickListener(this);
}

// onClick()

switch(view.getId(){
    case R.id.btn_one:
       // do something
       break;
    ...
}
于 2013-07-19T13:12:07.830 回答
0
    ****just implement View.OnClickListener and override the onClick(View v) as
    public class YourActivity implements Activity implements View.OnClickListener
    {
     super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        f1 =(Button) findViewById(R.id.f1);
        f2 =(Button) findViewById(R.id.f2);
        f1.setOnClickListener(this);
        f2.setOnClickListener(this);

          @Override
        public void onClick(View v) {
        // TODO Auto-generated method stub

            switch(v.getId())
            {
             case R.id.f1: //your implementation
             break;
             case R.id.f2: //your implementation
             break;
            }
        }
    }
于 2013-07-19T13:15:15.587 回答
0

考虑到Android官方文档:http: //developer.android.com/guide/topics/ui/controls/button.html

您在 android:onClick 属性中声明的方法必须具有完全如上所示的签名。具体来说,该方法必须:

公开

返回无效

定义一个视图作为它的唯一参数(这将是被点击的视图)

所以,在 XML 中提到方法名

android:onclick="onButtonClicked"

在活动中:

public void onButtonClicked(View v) {
    switch (v.getId()) {
    case R.id.Button1:

    break;
    case R.id.Button2:

    break;
    .
    .
    .
    . and so on 
    case R.id.Button10:

    break;
    }
}
于 2013-07-19T13:18:10.730 回答
0

我有同样的问题,但我找到了最好的解决方案(至少对我来说),首先你需要创建一个 Button 列表,然后是 int id 数组

    Button[] listBtn = new Button[3];
    IntId[] idList = {R.id.btn1, R.id.btn2, R.id.btn3};

    for(int i = 0 ; i < listBtn.length ; i++)
        listBtn[i] = (Button) findViewById (idList[i]);

    for(Button btn:listBtn)
        btn.setOnClickListener(btnListener);

    .......

    private View.OnClickListener btnListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            for(int i = 0 ; i < listBtn.length ; i++){

                if(v.getId() == idArray[i]){

                    //do something
                    String str = "Button number : "+ i;
                    Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
                }
            }

        }
    };

`

于 2016-04-20T09:21:51.543 回答
0
public class ExampleActivity extends AppCompatActivity implements View.Onclicklistener {

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

    f1 =(Button) findViewById(R.id.f1);
    f2 =(Button) findViewById(R.id.f2);
    Utils.setObjectOnClickListener(this, f1, f2);

@Override
  public void onClick(View view) {
    Intent intent = null;
    switch (view.getId()) {
      case R.id.f1: 
      // Do your code here
      break;
      case R.id.f2:
      // Do your code here
      break;
}

}

In your Utils.class define this method

public static void setObjectOnClickListener(View.OnClickListener listener, View... views) {
        for (View view : views) {
            view.setOnClickListener(listener);
        }
    } 
于 2016-12-10T15:53:15.767 回答