【问题标题】:Android one OnClick method for multiple buttons?Android 一个用于多个按钮的 OnClick 方法?
【发布时间】:2011-10-24 09:19:25
【问题描述】:

我在android中开始了一点程序, 我在一个活动中有 3 个按钮。

我看到了一些示例代码,它们将相同的OnClick 事件分配给所有按钮(即使它们执行完全不同的操作)并且在方法Switch(id) case case ...

什么是更好的方法?一个onClick方法和切换还是很多方法,每个按钮一个?

谢谢。

【问题讨论】:

    标签: java android button onclick


    【解决方案1】:

    这样使用:

    @Override
    public void onCreate(Bundle savedInstanceState) {
            button1.setOnClickListener(onClickListener);
            button2.setOnClickListener(onClickListener);
            button3.setOnClickListener(onClickListener);
    }
    
    private OnClickListener onClickListener = new OnClickListener() {
         @Override
         public void onClick(View v) {
             switch(v.getId()){
                 case R.id.button1:
                      //DO something
                 break;
                 case R.id.button2:
                      //DO something
                 break;
                 case R.id.button3:
                      //DO something
                 break;
             }
    
       }
    };
    

    【讨论】:

    • 那是抽象方法。我认为我们不需要关心它。
    • 如果我们在不同的活动中有按钮,我们怎么能做到这一点?
    • @Subzero-273K,我不认为我们可以处理一个地方不同活动中按钮的点击事件。应在适当的上下文中处理它们。
    • R.java 文件中的 ID 不是 final 。所以不能在switch case中使用。
    【解决方案2】:

    如果您想减少编码行数,请使用View's OnClick() with switch statement,如果您想单独处理所有点击(以便于理解和维护代码),请使用单独的所有button's onClick().

    更新:

    如果您在 Activity 布局 xml 文件中声明了按钮,则为所有按钮编写具有相同方法名称的属性 android:onClick="" 并在您的 Activity 中实现该方法。现在你有一个所有按钮的方法,并在该方法中区分具有 id 的按钮。

    示例:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical" >
        <Button android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:onClick="buttonOnClick"
                android:layout_height="wrap_content"
                android:text="Hello, I am a Button 1" />
        <Button android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:onClick="buttonOnClick"
                android:layout_height="wrap_content"
                android:text="Hello, I am a Button 2" />
        <Button android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:onClick="buttonOnClick"
                android:layout_height="wrap_content"
                android:text="Hello, I am a Button 3" />
    </LinearLayout>
    

    现在在你的 Activity 中实现buttonOnClick like,

    public void buttonOnClick(View view)
    {
     switch(view.getId())
     {
      case R.id.button1:
      // Code for button 1 click
      break;
    
      case R.id.button2:
      // Code for button 2 click
      break;
    
      case R.id.button3:
      // Code for button 3 click
      break;
     }
    }
    

    或者您可以为活动中动态添加的按钮应用相同的开关盒, 就像你必须使用 implemented View 的 OnClickListerner's onClick 而不是 buttonOnClick

    【讨论】:

      【解决方案3】:
      this.btnAddFriedtoFacebook = (Button) this.findViewById(R.id.btnAddFriedtoFacebook);
      this.btnAddFriedtoFacebook.setOnClickListener(this.backButtonClickListener);
      
      public OnClickListener backButtonClickListener = new OnClickListener()
      {
      public void onClick(final View view)
      {
         if (view == MatchInfoActivity.this.btnBack)
          {
              MatchInfoActivity.this.finish();
          }
          if( view == MatchInfoActivity.this.btnAddFried){
             Intent i = new Intent(Intent.ACTION_VIEW);
             MatchInfoActivity.this.startActivity(i);
          }
          if( view == MatchInfoActivity.this.btnAddBuddy){
             Intent i = new Intent(Intent.ACTION_VIEW);
             MatchInfoActivity.this.startActivity(i);
          }
      }
      };
      

      这是一个好方法。

      【讨论】:

      • 他不是在问如何处理点击,只是他已经知道的两种技术中的哪一种是首选。
      【解决方案4】:

      我认为在 xml(布局)中注册 onClick 是更好的方法。

      编辑:

      找到相关话题:

      1. Best practice for defining button events in android
      2. best practices for handling UI events

      【讨论】:

      • 我认为将它放在 XML 中有点奇怪,因为它是唯一以这种方式工作的 UI 行为。如果它更像 iOS,您可以从 UI 设计器中设置所有 UI 处理程序,这会更有意义。
      【解决方案5】:

      在 XML 布局中注册 onClick 事件,然后在代码中处理。我会这样做:

      <Button
      android:id="@+id/btplus"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Click me"
      android:onClick="onBtnClicked">
      

      .class 中的方法

      public void onBtnClicked(View v) {
              switch (v.getId()) {
              case R.id.btplus:
                  Toast.makeText(getApplicationContext(), "Plus is clicked" + "+", Toast.LENGTH_SHORT).show(); 
                  break;
              case R.id.btminu:
                  Toast.makeText(getApplicationContext(),"Minus is clicked" + "-", Toast.LENGTH_SHORT).show();
                  break;
              default:
                  break;
              }
          }
      

      【讨论】:

        【解决方案6】:

        @Nguyen 回答的一点补充。

        findViewById(R.id.buttonOne).setOnClickListener(buttonClickListener);
        ....    ....    ....    ....
        findViewById(R.id.buttonN).setOnClickListener(buttonClickListener);
        
        private View.OnClickListener buttonClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.buttonOne:
                        // do something
                        break;
                    ....    ....    ....    ....
                    case R.id.buttonN:
                        // do something
                        break;
                }
            }
        };
        

        如果您不想初始化按钮变量,但想跟踪按钮单击事件,这可能很有用。谢谢!

        【讨论】:

          猜你喜欢
          • 2011-11-27
          • 2014-02-07
          • 1970-01-01
          • 1970-01-01
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 2016-08-07
          • 1970-01-01
          相关资源
          最近更新 更多