Reputation: 255
What I mean is not each of the buttons do each individual work. What I mean is that like there are many buttons. Then 4 buttons is choose randomly in an order from the bunch of buttons. Then the user had to click the chosen 4 buttons in the same order and then something will happen. This is the code I had done.
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");
}
}
}
}
}
};
My code does not work at all, it will only work if all the 4 buttons are the same button. Is there any method to solve this by using the same OnClickListener
for all the 4 buttons. Or is there some other method to get many View
on 1 OnClickListener
?
This is the whole code
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");
}
}
}
};
Upvotes: 1
Views: 1864
Reputation: 769
simple solution
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;
}
}
Upvotes: 3
Reputation: 5236
I guess something like this is what you are asking for;
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" />
Code Behind :
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
}
}
}
}
Meant to keep it simple, at least for the if
controls. Well simple put; declare the order you want using mDesiredOrder
. Each time the user clicks a Button
, the button's Id
will be stored in mClickedButtonIds
and if there are more stored items then the desired combination length; first (old data) stored id will be removed shrinking mClickedButtonIds size.
Upvotes: 0
Reputation: 1559
Why not store an id in a comma delimited string or even in an array. Everytime a button is clicked append it to the string or add it to the array.. When the string.length == expectedlength or the array length == expectedlength then check the order....
Upvotes: 0
Reputation: 887
you can use the attribute android:onclick in each button in the xml to assing the same method to all of them
<Button
android:id="@+id/button1"
style="@style/ElementButton"
android:onclick="someMethod" />
<Button
android:id="@+id/button2"
style="@style/ElementButton"
android:onclick="someMethod" />
Then declare someMethod(View view) with the code you want to execute. that way all buttons execute the same method.
Upvotes: 0