【问题标题】:add onclick listener to predefined button?将 onclick 侦听器添加到预定义按钮?
【发布时间】:2011-07-20 16:31:29
【问题描述】:

我的 xml 布局文件中有以下按钮...

<Button
    android:layout_width="150dip"
    android:id="@+id/button1"
    android:layout_height="50dip"
    android:text="@string/login"
    android:layout_marginRight="10dip">
</Button>

我想以编程方式在其 Java 文件中添加一个 onclick() 侦听器。我该怎么做?

【问题讨论】:

    标签: android


    【解决方案1】:

    你只需要这样的东西:

    Button buttonOne = (Button) findViewById(R.id.button1);
    buttonOne.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
                //Do stuff here
        }
    });
    

    【讨论】:

    • 很高兴知道这个例外。如果是 NullPointerException,那是因为您的 Activity 布局中实际上没有 ID 为 button1 的视图。如果是 ClassCastException,那是因为具有该 ID 的视图不是 Button。
    • 耶!感谢您的回复,但我发现我没有使用按钮所在的布局。我的错,再次感谢:)
    • @RossHambrick,有没有办法添加监听器而不是覆盖它?
    • @Pacerier 不幸的是,没有。如果您真的需要,您必须在 Button 子类中添加该行为。
    【解决方案2】:

    这个答案来自Five Ways to Wire Up an Event Listener。请阅读该博客文章以获得作者的更全面的解释。请参阅我的其他答案,了解这五种方式已改写为add multiple onClick listeners

    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
            findViewById(R.id.button1).setOnClickListener(new HandleClick());
        }    
        private class HandleClick implements OnClickListener{
            public void onClick(View arg0) {
                Button btn = (Button)arg0;  //cast view to a button
                // get a reference to the TextView
                TextView tv = (TextView) findViewById(R.id.textview1);
                // update the TextView text
                tv.setText("You pressed " + btn.getText());
            }
        }
    }
    

    2。接口类型

    public class main extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //use the handleClick variable to attach the event listener
            findViewById(R.id.button1).setOnClickListener(handleClick);
        }    
        private OnClickListener handleClick = new OnClickListener(){
            public void onClick(View arg0) {
                Button btn = (Button)arg0;
                TextView tv = (TextView) findViewById(R.id.textview1);
                tv.setText("You pressed " + btn.getText());
            }
        };
    }
    

    3。匿名内部类

    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 arg0) {
                Button btn = (Button)arg0;
                TextView tv = (TextView) findViewById(R.id.textview1);
                tv.setText("You pressed " + btn.getText());
                }
            });
        }     
    }
    

    4。在 Activity 中实现

    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);
        }    
        public void onClick(View arg0) {
            Button btn = (Button)arg0;
            TextView tv = (TextView) findViewById(R.id.textview1);
            tv.setText("You pressed " + btn.getText());
        }
    }
    

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

    public class main extends Activity{
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }    
        public void HandleClick(View arg0) {
            Button btn = (Button)arg0;
            TextView tv = (TextView) findViewById(R.id.textview1);
            tv.setText("You pressed " + btn.getText());
        }
    }
    

    xml:

    <Button android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button 1"
            android:onClick="HandleClick"/>
    

    【讨论】:

      【解决方案3】:

      你可以试试这个。

      public class myNewClass extends Activity implements OnClickListener {
          ................... 
          ...................       
      
          Button button = (Button)findViewById(R.id.button1);
          button.setOnClickListener(this);
      
              public void onClick(View v) {
                      Intent i = new Intent();
                      Bundle extras = new Bundle();
      
              // This will catch the button click 
              // Now do what you wanted to do as a 
              // result of the onClick
              }
       }
      

      【讨论】:

      • 如何在我的Activity 中实现OnClickListener
      • 我编辑了我的答案。查看类定义,即声明 OnClickListener 实现的地方
      【解决方案4】:

      您可以通过两种方式申请 onClicklistner: 1。在 onCreate 方法下
      2.外面的onCreate方法


      如果我们将在 onCreate 方法下使用,那么我们将这样使用:-

      protected void onCreate(@Nullable Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_my_graphics1);
      
              textview1 = (TextView) findViewById(R.id.textview1);
              circleBtn = (Button) findViewById(R.id.circleBtn);
      
              // Click Listner Under on Create Method
              circleBtn.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
      
                  }
              });
      

      }

      如果您想使用 onCreate 方法,那么首先在 onCreate 方法中注册 onClickListner,如下所示:-

      @Override
          protected void onCreate(@Nullable Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_my_graphics1);
      
              circleBtn = (Button) findViewById(R.id.circleBtn);
      
              **// Register on click on button
              circleBtn.setOnClickListener(new ClickMe());**
      
          }
      

      然后在 onCreate 方法之外实现 clicklistner,这样完整的代码将如下所示:-

      public class ActiononBtn extends AppCompatActivity {
      
          private TextView textview1;
          private Button circleBtn;
      
      
      
      
          @Override
          protected void onCreate(@Nullable Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_my_graphics1);
      
              textview1 = (TextView) findViewById(R.id.textview1);
              circleBtn = (Button) findViewById(R.id.circleBtn);
      
              // Register on click on button
              circleBtn.setOnClickListener(new ClickMe());
      
          } // Close onCreate Method
      
      
          private class ClickMe implements View.OnClickListener {
              public void onClick(View v) {
      
              }
          }
      
      }//Close main Activity Class
      

      【讨论】:

        【解决方案5】:

        1.使用findViewById(R.id.button1).setOnClickListener(this);

        2.和activty实现OnClickListener

        【讨论】:

          【解决方案6】:
          <Button
              android:id="@+id/btnOk"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:text="Ok"
              android:layout_marginRight="50dp"
              android:layout_marginLeft="50dp"/>
          
          public class MainActivity extends AppCompatActivity {
          
              Button btnOk;
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
          
                  btnOk = findViewById(R.id.btnOk);
                  btnOk.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          Toast.makeText(MainActivity.this, "This button ok click.", Toast.LENGTH_SHORT).show();
                      }
                  });
              }
          }
          

          【讨论】:

          • 请不要在没有解释的情况下发布代码作为答案。试着解释你的代码做了什么以及它是如何解决问题的。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-08
          相关资源
          最近更新 更多