【问题标题】:How to connect multiple of buttons in the same onclicklistener?如何在同一个 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?喜欢组合游戏?
  • 是的,我希望它井井有条

标签: android button view onclick onclicklistener


【解决方案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);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2011-03-20
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      相关资源
      最近更新 更多