将 onclick 侦听器添加到预定义按钮?

Posted

技术标签:

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

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

<Button
    android:layout_
    android:id="@+id/button1"
    android:layout_
    android:text="@string/login"
    android:layout_marginRight="10dip">
</Button>

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

【问题讨论】:

【参考方案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_
        android:layout_
        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_
    android:layout_
    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();
            
        );
    

【讨论】:

请不要在没有解释的情况下发布代码作为答案。试着解释你的代码做了什么以及它是如何解决问题的。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。

以上是关于将 onclick 侦听器添加到预定义按钮?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 onclick 侦听器添加到 QCheckBox?

Action Bar 的 Home 按钮的 onClick 监听器

按钮 onClick 事件侦听器在 Electron 应用程序中不起作用

片段内 Listview 中动态视图的 onClick 侦听器

带有旋转图标的 Android 材质按钮

单击列表视图中自定义单元格中按钮的侦听器