【问题标题】:How to tell which button was clicked in onClick()如何判断在 onClick() 中单击了哪个按钮
【发布时间】:2013-03-31 17:29:15
【问题描述】:

我在一个 Android 应用中有多个按钮。我想知道在 Java 代码中单击了哪个按钮。据我所知,这是通过这样的单一方法完成的:

public void onClick(View view) {
    // Do something
}

在该方法中,您必须确定单击了哪个按钮。对吗?

如果是这样,我如何判断哪个被点击了?我确实有 findViewById() 返回的各种 Button 对象。我只是不知道如何使用它们来判断点击了哪个按钮。

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    在您的活动类中实现 View 的 OnClickListner。覆盖点击方法。

     Button b1= (Button) findViewById(R.id.button1);
    //find your button id defined in your xml. 
    
    
    b1.setOnClickListener(this);
    // You have button OnClickListener implemented in your activity class.
    //this refers to your activity context.
    

    我使用了祝酒词。

    http://developer.android.com/guide/topics/ui/notifiers/toasts.html

     Toast.makeText(MainActivity.this,"button1", 1000).show();
     //display a toast using activity context ,text and duration
    

    使用 switch case 你可以检查点击了哪个按钮。

    在您的 onClick 方法中。

    switch(v.getId())  //get the id of the view clicked. (in this case button)
    {
    case R.id.button1 : // if its button1
        //do something
        break;
    }
    

    这是完整的代码。

    public class MainActivity extends Activity implements OnClickListener {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button b1= (Button) findViewById(R.id.button1);
        Button b2= (Button) findViewById(R.id.button2);
        Button b3= (Button) findViewById(R.id.button3);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);
        b3.setOnClickListener(this);
    
    }
    
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch(v.getId())
        {
        case R.id.button1 :
            Toast.makeText(MainActivity.this,"button1", 1000).show();
            break;
        case R.id.button2 :
            Toast.makeText(MainActivity.this,"button2", 1000).show();
            break;
        case R.id.button3 :
            Toast.makeText(MainActivity.this,"button3", 1000).show();
            break;  
    
    
        }
    
    }
     }
    

    【讨论】:

      【解决方案2】:

      有不同的方法来处理这个问题。有了你目前拥有的,你可以使用

          public void onClick(View view) {
          // Do something
          view.getId();
      }
      

      这将在您的xml 中返回android:id 的值。您可以使用switch 语句来比较这些值以决定要做什么并打开id。您还可以在您的xml 中为每个button 分配一个onClick()

      <Button
          ...
          android:onClick="functionName"/>
      

      然后在你的java代码中你可以拥有

      public void functionName(View view) {
              // Do something
          }
      

      点击此处的view 将是您在xml 中分配此onClickbutton

      【讨论】:

        【解决方案3】:

        如果是这样,我怎么知道哪个被点击了?

        老朋友switch会帮你实现目标:

        public void onClick(View view) {
           switch (view.getId()) {
              case R.id.btn1:
                 // do your stuff for btn1
              break;
              case R.id.btn2:
                 // do your stuff for btn2
              break;
              ...
           }
        }
        

        说明:每个小部件都有ID,因此您可以通过上面写的开关中的ID 来简单地处理哪个按钮被点击。

        view.getId() 返回小部件的ID

        【讨论】:

          【解决方案4】:

          您还可以为每个按钮使用匿名内部类:

          Button b1= (Button) findViewById(R.id.button1);
          Button b2= (Button) findViewById(R.id.button2);
          
          b1.setOnClickListener(new OnClickListener() {
              @Override
              public void onClick(View v) {
                  // button 1 was clicked!
              }
          });
          b2.setOnClickListener(new OnClickListener() {
              @Override
              public void onClick(View v) {
                  // button 2 was clicked!
              }
          });
          

          【讨论】:

            【解决方案5】:

            您可以使用ButterKnife 库(http://jakewharton.github.io/butterknife/):

            //Fragment
            @InjectView(R.id.dialog_userinput)
            public EditText userinput;
            
            @InjectView(R.id.dialog_passinput)
            public EditText passinput;
            
            @OnClick(R.id.dialog_login)
            public void login(View view) {
                //do stuff
                this.dismiss();
            }
            
            @OnClick(R.id.dialog_cancel)
            public void cancel(View view) {
                //do stuff
                this.dismiss();
            }
            
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.dialog_layout, container);
                ButterKnife.inject(this, view);
                return view;
            }
            

            【讨论】:

            • @InjectView 在 v7 中重命名为 @Bind,在 v8 中重命名为 @BindView
            【解决方案6】:
            implements 
            
                public class ProgramsFiles extends AppCompatActivity implements View.OnClickListener {
            
                   public void onClick(View view) {
                        switch (view.getId()) {
                           case R.id.btnA:
                             //ExampleA
                               break;
                           case R.id.btnB:
                            //ExampleB
                           break;      
                }
            }
            }
            

            【讨论】:

              猜你喜欢
              • 2010-10-18
              • 2012-11-12
              • 1970-01-01
              • 2011-02-10
              • 2011-04-04
              • 1970-01-01
              • 2013-10-09
              • 1970-01-01
              • 2011-05-30
              相关资源
              最近更新 更多