如何在同一个 onclicklistener 中连接多个按钮?
Posted
技术标签:
【中文标题】如何在同一个 onclicklistener 中连接多个按钮?【英文标题】:How to connect multiple of buttons in the same onclicklistener? 【发布时间】:2014-01-03 14:50:01 【问题描述】:我的意思不是每个按钮都可以完成每个单独的工作。我的意思是有很多按钮。然后从一堆按钮中按顺序随机选择4个按钮。然后用户必须以相同的顺序单击选择的 4 个按钮,然后会发生一些事情。这是我做的代码。
OnClickListener click2 = new OnClickListener()
@Override
public void onClick(View v)
if (v==ans1)
if (v==ans2)
if (v==ans3)
if (v==ans4)
tv1.setText("You Win");
;
我的代码根本不起作用,只有当所有 4 个按钮都是同一个按钮时才会起作用。有什么方法可以通过对所有 4 个按钮使用相同的 OnClickListener
来解决这个问题。还是有其他方法可以在 1 个OnClickListener
上获得多个View
?
这是完整的代码
public class MemoryActivity extends Activity
ImageButton btn1, btn2, btn3, btn4, btn5;
ImageButton ans1, ans2, ans3, ans4, ans5;
TextView tv1, tv2, tv3, tv4;
Button start;
Random random = new Random();
Handler handler1 = new Handler();
private List<Integer> mClickedButtonIds = new ArrayList<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory);
tv1 = (TextView)findViewById(R.id.textView1);
tv2 = (TextView)findViewById(R.id.textView2);
tv3 = (TextView)findViewById(R.id.textView3);
start = (Button)findViewById(R.id.button1);
start.setOnClickListener(click1);
btn1 = (ImageButton)findViewById(R.id.imageButton1);
btn1.setOnClickListener(click2);
btn2 = (ImageButton)findViewById(R.id.imageButton2);
btn2.setOnClickListener(click2);
btn3 = (ImageButton)findViewById(R.id.imageButton3);
btn3.setOnClickListener(click2);
btn4 = (ImageButton)findViewById(R.id.imageButton4);
btn4.setOnClickListener(click2);
private OnClickListener click1 = new OnClickListener()
@Override
public void onClick(View v)
final ImageButton[] all= btn1, btn2, btn3, btn4;
for (int a=0; a<4; a++)
final int b = a;
handler1.postDelayed(new Runnable() //start delay a
@Override
public void run() // actions start
btn5 = all[random.nextInt(all.length)];
if (b==0) ans1 = btn5;
else if (b==1) ans2 = btn5;
else if (b==2) ans3 = btn5;
else if (b==3) ans4 = btn5;
btn5.setBackgroundColor(Color.RED);
handler1.postDelayed(new Runnable() //start delay b
@Override
public void run()
btn5.setBackgroundResource(R.drawable.btn_default_holo_dark);
, 500); //end delay b
//action end
, 1000*a ); //end delay a
;
OnClickListene click2 = new OnClickListener()
@Override
public void onClick(View v)
int[] mDesiredOrder = new int[] ans1,ans2,ans3,ans4 ; //error here
mClickedButtonIds.add(v.getId());
if (mClickedButtonIds.size() > 4)
mClickedButtonIds.remove(0);
if (mClickedButtonIds.get(0) == mDesiredOrder[0]
&& mClickedButtonIds.get(1) == mDesiredOrder[1]
&& mClickedButtonIds.get(2) == mDesiredOrder[2]
&& mClickedButtonIds.get(3) == mDesiredOrder[3]
)
tv1.setText("You Win");
;
【问题讨论】:
您是否希望用户按您期望的顺序按下按钮。像;首先是 btn1,然后是 btn3、btn4 和 btn2?喜欢组合游戏? 是的,我希望它井井有条 【参考方案1】:简单的解决方案
private int i = 0;
@Override
public void onClick(View v)
switch (v.getId())
case R.id.button1:
/*if (i == 0)
i++;
else
i = 0;
*/
i = 1;
break;
case R.id.button2:
if (i == 1)
i++;
else
i = 0;
break;
case R.id.button3:
if (i == 2)
i++;
else
i = 0;
//some magic
break;
case R.id.button4:
if (i == 3)
i++;
else
i = 0;
//some magic
break;
default:
break;
【讨论】:
不符合 OP 的要求,他想检查点击的订单按钮 @Zefnus 不,当我回答这个问题时,他没有具体说明问题。现在我添加一些修改 你的方法只有1次。我希望它按顺序单击所有 4 个按钮,然后只会发生一些事情 @WOLVERINE 不错,提供了简单的解决方案。但是,如果 OP 要缓冲点击并做出反应只要输入正确的组合(我会这样做),此解决方案将不适用于:button1、button2、按钮 1、按钮 2、按钮 3、按钮 4. @Zefnus 我的代码 - 只是一个如何完成的示例。我解决了你的情况 - 请参阅编辑后的答案【参考方案2】:我猜你想要的是这样的东西;
XML:
<Button
android:id="@+id/btn1"
android:onclick="onClick" />
<Button
android:id="@+id/btn2"
android:onclick="onClick" />
<Button
android:id="@+id/btn3"
android:onclick="onClick" />
<Button
android:id="@+id/btn4"
android:onclick="onClick" />
代码背后:
public class MainActivity extends Activity
private List<Integer> mClickedButtonIds = new ArrayList<Integer>();
private int[] mDesiredOrder = new int[] R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4 ;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public void onClick(View v)
mClickedButtonIds.add(v.getId());
if (mClickedButtonIds.size() > mDesiredOrder.length)
mClickedButtonIds.remove(0);
if (mClickedButtonIds.get(0) == mDesiredOrder[0]
&& mClickedButtonIds.get(1) == mDesiredOrder[1]
&& mClickedButtonIds.get(2) == mDesiredOrder[2]
&& mClickedButtonIds.get(3) == mDesiredOrder[3])
// # Do something, buttons are clicked in the order you want
旨在保持简单,至少对于if
控件而言。简单地说; 声明你想要使用mDesiredOrder
的顺序。每次用户点击一个Button
,按钮的Id
将被存储在mClickedButtonIds
中,如果存储的项目多则为所需的组合长度;第一个(旧数据)存储的 id 将被删除,缩小 mClickedButtonIds 的大小。
【讨论】:
必须是private int[] mDesiredOrder = new int[] R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4 ;
吗?因为我得到了 4 个随机按钮并用变量 ans1, ans2, ans3, ans4
声明它们。当我将其更改为 private int[] mDesiredOrder = new int[] ans1, ans2, ans3, ans4 ;
时出现错误。
你试过改成private int[] mDesiredOrder = new int[] R.id.ans1, R.id.ans2, R.id.ans3, R.id.ans4 ;
试过但不能。原因 ans1
是变量而不是按钮的 id。除非有某种方法可以获取变量的 id
您在哪里以及如何声明ans1
?您的 XML 中的 id
属性值是什么?你能包括更多你的编码吗
无法理解您的大部分代码,但首先尝试将其更改为int[] mDesiredOrder = new int[] ans1.getId(), ans2.getId(), ans3.getId(), ans4.getId() ;
【参考方案3】:
您可以在 xml 中的每个按钮中使用属性 android:onclick 来为所有按钮分配相同的方法
<Button
android:id="@+id/button1"
style="@style/ElementButton"
android:onclick="someMethod" />
<Button
android:id="@+id/button2"
style="@style/ElementButton"
android:onclick="someMethod" />
然后用你要执行的代码声明 someMethod(View view)。这样所有按钮都执行相同的方法。
【讨论】:
这仅在您使用活动时才有效,不适用于片段并导致很多方法,这有点难以阅读。不推荐【参考方案4】:为什么不将 id 存储在逗号分隔的字符串甚至数组中。每次单击按钮时,将其附加到字符串或将其添加到数组中。当 string.length == expectedlength 或数组长度 == expectedlength 时,请检查顺序...。
【讨论】:
【参考方案5】:有一个简单的、面向对象的方法来解决这个问题。创建一个名为ButtonSequence
的新对象,其内容如下:
public class ButtonSequence
public Button[] buttons;
private int index = -1;
public ButtonSequence(Button[] buttons)
this.buttons = buttons;
public boolean isNextButton(Button b)
return b == nextButton();
private Button nextButton()
index++;
if (index >= buttons.length)
return null;
return buttons[index];
现在您可以使用此对象指定您的按钮顺序,例如:
ButtonSequence seq = new ButtonSequence(ans1, ans2, ans3, ans4);//assuming ans1-4 are instantiated buttons
然后,在每次单击按钮后,调用isNextButton()
。为此,请在您的 class
中继承 OnClickListener
:
public class MyActivity implements OnClickListener
然后重写需要的方法:
public void onClick(View v)
boolean correct = seq.isNextButton((Button) v);
if (correct)
//if this was the last in the pattern, then the pattern was successful
else
//the user pressed the buttons out of order
最后,为所有按钮设置点击监听器:
ans1.setOnClickListener(this);
ans2.setOnClickListener(this);
...//etc
如果您有很多按钮,并且觉得这很乏味,请考虑使用droidQuery 将您的代码简化为:
$.with(this).selectByType("android.widget.Button").each(new Function()
@Override
public void invoke($ d, Object... args)
d.view(0).setOnClickListener(MyActivity.this);
);
【讨论】:
以上是关于如何在同一个 onclicklistener 中连接多个按钮?的主要内容,如果未能解决你的问题,请参考以下文章
如何在中等信任环境中连接到当前的 FormsAuthenticationModule?