代码之家  ›  专栏  ›  技术社区  ›  xpepermint

Android OnClickListener-识别按钮

  •  134
  • xpepermint  · 技术社区  · 15 年前

    public class Mtest extends Activity {
      Button b1;
      Button b2;
      public void onCreate(Bundle savedInstanceState) {
        ...
        b1 = (Button) findViewById(R.id.b1);
        b2 = (Button) findViewById(R.id.b2);
        b1.setOnClickListener(myhandler);
        b2.setOnClickListener(myhandler);
        ...
      }
      View.OnClickListener myhandler = new View.OnClickListener() {
        public void onClick(View v) {
          // MY QUESTION STARTS HERE!!!
          // IF b1 do this
          // IF b2 do this
          // MY QUESTION ENDS HERE!!!
        }
      }
    }
    

    如何检查已单击的按钮?

    11 回复  |  直到 5 年前
        1
  •  199
  •   Cristian    11 年前

    你将学会如何轻松地做到这一点:

    public class Mtest extends Activity {
      Button b1;
      Button b2;
      public void onCreate(Bundle savedInstanceState) {
        ...
        b1 = (Button) findViewById(R.id.b1);
        b2 = (Button) findViewById(R.id.b2);
        b1.setOnClickListener(myhandler1);
        b2.setOnClickListener(myhandler2);
        ...
      }
      View.OnClickListener myhandler1 = new View.OnClickListener() {
        public void onClick(View v) {
          // it was the 1st button
        }
      };
      View.OnClickListener myhandler2 = new View.OnClickListener() {
        public void onClick(View v) {
          // it was the 2nd button
        }
      };
    }
    

    View.OnClickListener myOnlyhandler = new View.OnClickListener() {
      public void onClick(View v) {
          switch(v.getId()) {
            case R.id.b1:
              // it was the first button
              break;
            case R.id.b2:
              // it was the second button
              break;
          }
      }
    }
    

    不过,我不建议这样做,因为您将不得不添加 if

        2
  •  77
  •   Peter Mortensen icecrime    13 年前

    或者你也可以尝试同样的方法,但是没有听众。在按钮XML定义上:

    android:onClick="ButtonOnClick"
    

    在代码中定义方法 ButtonOnClick

    public void ButtonOnClick(View v) {
        switch (v.getId()) {
          case R.id.button1:
            doSomething1();
            break;
          case R.id.button2:
            doSomething2();
            break;
          }
    }
    
        3
  •  42
  •   Ziem    10 年前

    我更喜欢:

    class MTest extends Activity implements OnClickListener {
        public void onCreate(Bundle savedInstanceState) {
        ...
        Button b1 = (Button) findViewById(R.id.b1);
        Button b2 = (Button) findViewById(R.id.b2);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);
        ...
    }
    

    然后:

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.b1:
                ....
                break;
            case R.id.b2:
                ....
                break;
        }   
    }
    

    Switch - case 维护起来比 if - else ,并且此实现不需要生成许多类变量。

        4
  •  16
  •   Suragch Shmidt    10 年前

    Five Ways to Wire Up an Event Listener 这是一篇很棒的文章,概述了设置单个事件侦听器的各种方法。让我在这里为多个听众展开。

    1成员类

    public class main extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //attach an instance of HandleClick to the Button
            HandleClick handleClick = new HandleClick();
            findViewById(R.id.button1).setOnClickListener(handleClick);
            findViewById(R.id.button2).setOnClickListener(handleClick);
        }    
        private class HandleClick implements OnClickListener{
            public void onClick(View view) {
                switch(view.getId()) {
                case R.id.button1:
                    // do stuff
                    break;
                case R.id.button2:
                    // do stuff
                    break;
                }
            }
        }
    }
    

    2接口类型

    public class main extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            findViewById(R.id.button1).setOnClickListener(handleClick);
            findViewById(R.id.button2).setOnClickListener(handleClick);
        }
        private OnClickListener handleClick = new OnClickListener() {
            public void onClick(View view) {
                switch (view.getId()) {
                case R.id.button1:
                    // do stuff
                    break;
                case R.id.button2:
                    // do stuff
                    break;
                }
            }
        };
    }
    

    public class main extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
                public void onClick(View view) {
                    // do stuff
                }
            });
            findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
                public void onClick(View view) {
                    // do stuff
                }
            });
        }
    }
    

    4活动中的实施

    public class main extends Activity implements OnClickListener {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            findViewById(R.id.button1).setOnClickListener(this);
            findViewById(R.id.button2).setOnClickListener(this);
        }
        public void onClick(View view) {
            switch (view.getId()) {
            case R.id.button1:
                // do stuff
                break;
            case R.id.button2:
                // do stuff
                break;
            }
        }
    }
    

    5OnClick事件的视图布局中的属性

    public class main extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
        public void HandleClick(View view) {
            switch (view.getId()) {
            case R.id.button1:
                // do stuff
                break;
            case R.id.button2:
                // do stuff
                break;
            }
        }
    }
    

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="HandleClick" />
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="HandleClick" />
    
        5
  •  12
  •   lory105    11 年前

    如果您不想在类代码中保存2按钮的实例,请遵循以下更好的方法(这样更清晰、更快速!!):

    public void buttonPress(View v) {
      switch (v.getId()) {
        case R.id.button_one:
            // do something
            break;
        case R.id.button_two:
            // do something else
            break;
        case R.id.button_three:
            // i'm lazy, do nothing
            break;
      }
    }
    
        6
  •  12
  •   Ziem    10 年前

    另一种方法是活动中的单个侦听器,如下所示:

    public class MyActivity extends Activity implements OnClickListener {
        .......  code
    
        //my listener
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.mybutton) { 
                DoSomething();
                return;
            }
    
            if (v.getId() == R.id.mybutton2) { 
                DoSomething2();
                return;
            }
        }
    }
    

    //my listener
    @Override
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.mybutton:
            { 
                 DoSomething();
                 break;
            }
    
            case R.id.mybutton2:
            {
                DoSomething();
                break;
            }
        }
    }
    
        7
  •  9
  •   ognian    15 年前

    最好的办法是 switch -在v.getId()之间初始化。为每个按钮设置单独的匿名OnClickListener会占用更多内存。不需要将视图强制转换为按钮。在可能切换的情况下使用if-else会更慢、更难读取。在Android的源代码中,您经常会注意到通过if else比较引用:

    if (b1 == v) {
     // ...
    } else if (b2 == v) {
    

        8
  •  7
  •   David rakar    11 年前

    使用setTag();

    这样地:

    @Override    
    public void onClick(View v) {     
        int tag = (Integer) v.getTag();     
        switch (tag) {     
        case 1:     
            System.out.println("button1 click");     
            break;     
        case 2:     
            System.out.println("button2 click");     
           break;   
        }     
    }     
    
        9
  •  4
  •   DonSteep    15 年前

        10
  •  4
  •   Ziem    10 年前
    Button mybutton = new Button(ViewPagerSample.this);
    mybutton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
                // TODO Auto-generated method stub
        }
    });
    
        11
  •  1
  •   user7925882    8 年前
    Button button1 = (Button)findViewById(R.id.button1);
    button1.setOnClickListener(this);
    
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        if(v.getId() == R.id.button1){
            Toast.makeText(context, "Button 1 Click", Toast.LENGTH_LONG).show();
        }
    }
    

    Check this article for more details