【发布时间】:2011-04-13 08:29:57
【问题描述】:
我的布局 XML 文件中有 16 个Buttons(数字、加号、减号等)。
我想知道如何检查按下了哪个按钮。
我的想法是,我将为每个按钮使用 onClick() 方法,但这种方法有点不切实际,因为我将为每个按钮使用 16 个 onClick() 方法。
有没有更优雅的方式?
【问题讨论】:
我的布局 XML 文件中有 16 个Buttons(数字、加号、减号等)。
我想知道如何检查按下了哪个按钮。
我的想法是,我将为每个按钮使用 onClick() 方法,但这种方法有点不切实际,因为我将为每个按钮使用 16 个 onClick() 方法。
有没有更优雅的方式?
【问题讨论】:
您可以在实现 OnClickListener 的单个类中处理它们,如果您愿意,也可以在活动类中处理它们......
import android.view.View.OnClickListener;
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;
}
}
}
【讨论】:
您可以使用一个不定义为匿名内部类的处理程序,而是在一个单独的类中。 onClick() 会获取传入的视图,你可以从中选择。
public class MyActivity implements OnClickListener {
public void onClick(View v) {
Button b = (Button)v;
// do what you want
}
...
}
然后在你的 layout.xml 中为每个按钮添加
<Button android:id=".."
android:onClick="onClick"
【讨论】:
当然。创建一个 button-ids 数组,并在循环中为它们分配相同的侦听器(View.OnClickListener 的实现 - 定义为单独的类,而不是匿名类)。在监听器中,您可以检查哪个是按下的按钮(通过比较 onClick() 方法中的 view 参数)。
活动中:
MyOnClickListener myListener = new MyOnClickListener();
for (int id : buttonIdArray)
((Button)findViewById(id)).setOnClickListener(myListener);
在onClick方法中:
int id = view.getId();
switch (id)
{
case ...:
// Do stuff
case ...:
// Do different stuff
}
【讨论】:
您不必在点击侦听器中提及 16。创建一个并将其附加到每个按钮。 onClick() 方法获取一个视图作为参数。此视图是您的按钮。只需检查它的 ID 或名称即可。
【讨论】:
import android.view.View.OnClickListener;
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);
Button buttonB = (Button) findViewById(R.id.buttonB);
buttonA.setOnClickListener(this);
buttonB.setOnClickListener(this);
}
public void onClick(View v) {
if(v==buttonA)
{
do something...
}
if(v==buttonB)
{
do something...
}
}
【讨论】:
我通常会这样做:
@Override
public boolean onTouch(View v, MotionEvent event)
{
Button thisButton = (Button) v;
switch (event.ACTION_DOWN)
{
case MotionEvent.ACTION_DOWN:
for (int i = 0; i < _button.length;i++)
if (tagOf(thisButton) == tagOf(_button[i]))
{
System.out.println("Button " + i + " pressed!");
_textView[i].setText(String.valueOf(_settingBrowser.countUpPosition(i)));
}
}
return false;
}
int tagOf (Button b)
{
return Integer.parseInt(b.getTag().toString());
}
在主类中使用 ID 号启动按钮,如下所示:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
_button = new Button[FIELDS];
_button[0] = (Button) findViewById(R.id.Button01);
_button[1] = (Button) findViewById(R.id.Button02);
_button[2] = (Button) findViewById(R.id.Button03);
_button[3] = (Button) findViewById(R.id.Button04);
_button[4] = (Button) findViewById(R.id.Button05);
_button[5] = (Button) findViewById(R.id.Button06);
_padListener = new SettingButtonListener(_button);
for (int j = 0; j < _button.length; j++){
_button[j].setTag(j);
_button[j].setOnTouchListener(_padListener);
}
}
如果您有大量的按钮,并且想要为所有按钮使用相同的侦听器,那么这很简洁。 干杯!
【讨论】: