如何在同一个onclicklistener中连接多个按钮?

时间:2014-01-03 14:50:02

标签: android button view onclick onclicklistener

我的意思是并非每个按钮都能完成每项工作。我的意思是,有很多按钮。然后从一堆按钮中按顺序随机选择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");
            }
        }       
    } 




    }; 

5 个答案:

答案 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);
    }
});