Android:许多按钮,一个OnClickListener?

时间:2013-02-18 20:30:29

标签: android button onclick

我目前正在开发一个Android应用程序,并且有一些问题。

1)在我的应用中,有一个电池模块部分。它们将超过50个按钮。所以,而不是做这样的事情:

 public class MyActivity extends Activity implements OnClickListener {

  @Override public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     Button buttonA = (Button) findViewById(R.id.buttonA);    
     buttonA.setOnClickListener(this);
     Button buttonB = (Button) findViewById(R.id.buttonB); 
     buttonB.setOnClickListener(this);
  }

//etc... etc...

public void onClick(View v) {

  switch (v.getId()) {
     case R.id.buttonA: 
      // do something
      break;
     case R.id.buttonB:
      // do something else
      break;
  }
}  
}

有更简单的方法吗?当您单击电池模式按钮时,它将显示模块的图像以及安装它的选项。除了图像,每个mod都是一样的。如果没有更简单的方法。

4 个答案:

答案 0 :(得分:3)

为此目的未讨论太多的所有视图的一个有用组件是tag属性。您可以将View的标记设置为任何对象:

Object foo = new Object();
button1.setTag(foo);

您可以使用它轻松地将标记分配给图像的名称,或者可能是Drawable资源的ID。然后对所有这些按钮使用一个onClick方法,只需解压缩标记以确定应如何使用它:

public void onClick(View v)
{
    //any button was clicked. Now determine what to do using the tag.

    Object tag = v.getTag();
    //TODO: use tag.


}

答案 1 :(得分:2)

您可以设置布局文件中每个按钮的onClick回调。类似的东西:

<Button
    android:id="@+id/buttonId"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/buttonText"
    android:onClick="onItemClick" />

然后,添加您的活动/片段:

public void onItemClick(View view) {
    // Do something in response to button click
}

此处提供更多信息:http://developer.android.com/guide/topics/ui/controls/button.html#HandlingEvents

答案 2 :(得分:1)

您可以像这样迭代按钮 -

int[] buttons = { R.id.button1, R.id.button2, ... , R.id.button30 };

for( int i=0; i < buttons.length; i++ ) {
    final Button b = (Button) findViewById( buttons[ i ] );
    b.setOnClickListener( ... );
}

答案 3 :(得分:0)

不同之处在于id。所以你不能循环使用它,你需要输入它:

private static final BUTTON_IDS={R.id.buttonA,R.id.buttonB,R.id.buttonC....R.id.buttonZ};

然后循环它:

    for(int i=0;i<BUTTON_IDS.lenght;i++{
        Button buttonXYZ = (Button) findViewById(BUTTON_IDS[i]);    
        buttonXYZ.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                    if(...){
                        //your spical cases
                    }
                    else{
                        //do awesome generic stuff.
                    }

                    }
                });
    }