如何在同一个 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 中连接多个按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash中连接到wifi?

如何在中等信任环境中连接到当前的 FormsAuthenticationModule?

如何在 PySpark 中连接到 Presto JDBC?

如何在 swing 中连接到 h2 数据库

如何在 CodeIgniter 中连接到 SQL Server 数据库?

如何在 Qt 应用程序中连接到 MySQL 服务器