给预定义按钮添加点击监听器?

36

我在我的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()监听器。我该如何做?

6个回答

84

你只需要像这样:

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

1
知道异常会很好。如果是NullPointerException,那是因为你的Activity布局中实际上没有一个ID为“button1”的视图。如果是ClassCastException,那是因为具有该ID的视图不是Button。 - Ross Hambrick
太好了!谢谢你的回复,但我发现我没有使用按钮所在的布局。我的错,再次感谢 :) - mr5
1
@RossHambrick,有没有一种方法可以添加监听器而不是覆盖它? - Pacerier
很抱歉,@Pacerier。如果你真的需要这个行为,你必须在一个按钮子类中添加它。 - Ross Hambrick

22

这个答案来自《Android Cookbook》中的“五种连接事件监听器”的章节。请阅读作者的博客文章以获得更详细的解释。请查看我的另一个答案,以查看对这五种方法进行改进以添加多个onClick监听器的方法。

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. 点击事件中视图布局的属性

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"/>

6
你可以尝试这个。
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? - mr5
我编辑了我的回答。看一下类定义,那里是你的 OnClickListener 实现声明的地方。 - apesa

1

您可以通过两种方式应用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

0

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

2. 并且 activity 实现 OnClickListener 接口


0
<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();
            }
        });
    }
}

请不要在回答中只贴代码而没有解释。尽量解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Zsolt Meszaros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接