我的意思是并非每个按钮都能完成每项工作。我的意思是,有很多按钮。然后从一堆按钮中按顺序随机选择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 View
上获得许多OnClickListener
?
这是整个代码
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");
}
}
}
};
答案 0 :(得分:3)
简单的解决方案
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;
}
}
答案 1 :(得分:0)
您可以在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视图)。这样所有按钮都执行相同的方法。
答案 2 :(得分:0)
为什么不将id存储在逗号分隔的字符串中,甚至存储在数组中。每次单击一个按钮时,将其附加到字符串或将其添加到数组中。当string.length == expectedlength或数组长度== expectedlength时,请检查顺序....
答案 3 :(得分:0)
我想这样的事情就是你所要求的;
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大小。
答案 4 :(得分:0)
这个问题有一种简单的,面向对象的方法。创建一个名为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];
}
}
现在您可以使用此Object指定按钮序列,例如:
ButtonSequence seq = new ButtonSequence(ans1, ans2, ans3, ans4);//assuming ans1-4 are instantiated buttons
然后,在每次按下按钮后,调用isNextButton()
。为此,请在OnClickListener
中继承class
:
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);
}
});