user3153613
user3153613

Reputation: 255

How to connect multiple of buttons in the same onclicklistener?

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

Answers (4)

WOLVERINE
WOLVERINE

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

Saro Taşciyan
Saro Taşciyan

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

Skindeep2366
Skindeep2366

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

Pablo_Cassinerio
Pablo_Cassinerio

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

Related Questions