Android基础控件Button

Button组件在UI中显示是一个按钮,用来执行用户点击事件的;我们可以通过四种形式为Button设置监听事件来实现其要处理的事情。(不过其中内部类和外部类差不多,就以外部类为例,不再累述内部类的形式)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/linearlayout1"
    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/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:background="#00FF00"
        android:text="匿名内部类实现"/>
    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:background="#FF0000"
        android:text="外部类实现"/>
    <Button
        android:id="@+id/btn3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:background="#0000FF"
        android:text="实现View.OnClickListener接口"/>
</LinearLayout>

首先我们在布局中创建btn1, btn2, btn3三个按钮,现在可以看到显示效果如左下: 

      

 

然后再分别以下列形式为界面中三个按钮实现事件监听器。

1. 匿名内部类的形式:

//以匿名内部类的形式实现Button1的事件监听器
btn1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "该按钮是以匿名内部类的形式实现的", Toast.LENGTH_LONG).show();
    }
});

当然在使用组件之前要先获取组件名,先在类中声明了三个Button类型的按钮private Button btn1, btn2, btn3;然后在onCreate()方法中通过findViewById()方法获取在布局文件中定义的组件。关于findViewById(),它返回的是一个View的对象,因为所有的组件都是View的直接或间接子类。所以需要强制类型转换得到Button组件。

然后以上述代码完成事件监听。在代码的OnClick()方法中使用Toast.makeText()方法产生一条消息。第一个参数是个context上下文,第二个参数为消息内容,第三个为显示消息的时间长短。最后调用show()方法完成显示。

点击该按钮,实现效果如右上图所示

 

2. 外部类监听事件形式:

既然是外部类,所以先要在项目中创建另一个类(或者是该MainActivity中再创建一个类也行),如OuterClass,要设置按钮的点击事件,所以需要为该类实现OnClickListener接口,并且实现其onClick()方法。

public class OuterClass implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        Log.i("TAG", "该按钮是以外部类的形式实现的");
    }
}

外部类创建完毕之后,就要在MainActivity中为按钮调用setOnClickListener()方法,然后里面的形式又是匿名类。可以看到,在OnClick()方法中,首先调用父类onClick()方法,然后再完成自己的事件逻辑。

//以外部类的形式实现事件监听器
btn2.setOnClickListener(new OuterClass() {
    @Override
    public void onClick(View v) {
        super.onClick(v);
        Toast.makeText(MainActivity.this, "该按钮是以外部类的形式实现的", Toast.LENGTH_LONG).show();
    }
});

所以,当有很多的组件需要实现共同的功能时,可以通过外部类的形式,在外部类的onClick()方法中实现共同的功能。运行结果如左下图所示。

其实外部类的形式我觉得有点像是匿名内部类和下面实现OnClickListener接口的两种方式的杂糅。 


    

 

3. 实现OnClickListener接口形式:

关于实现该接口,注意是android.view.View包下的OnClickListener接口,因为还存在一个android.content.DialogInterface包下的。实现完接口顺带着实现该接口的onClick()方法。然后在该方法中实现处理事件。

public class MainActivity extends Activity implements View.OnClickListener {
    ...
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "该按钮是以实现OnClickListener接口的形式实现的", Toast.LENGTH_LONG).show();
    }
}

onCreate()方法中,按钮仍然要调用setOnClickListener()方法,不过此时这里面的参数输入this即可。

//以实现OnClickListener接口的形式实现事件监听器
btn3.setOnClickListener(this);

点击效果如右上图所示

 

4. 内部类形式:

既然有外部类实现,那么当然也有内部类实现。这里就不过多的输入代码了,毕竟对比于外部类只是一个类是放在外面,一个类是作为内部类实现的。具体的代码和外部类一致。

 

关于Button组件,我觉得可以和ImageButton放在一起来讲,只是其中一个是放的文本,一个放的是图片。

属性

Button

ImageButton

android:text

有,为按钮设置显示的文字描述

无,写上也不会报错,只是没效果

android:src

无,写上也不会报错,只是没效果

有,并且随设置的按钮宽度和高度的变化自适应

android:background

设置按钮的背景颜色,也可以是背景图片

设置图片按钮的背景颜色,也可以是背景图片;随按钮的宽度和高度变化而被拉伸

如果像让图片按钮显示的是文字信息,只能是将src属性中的图片弄成文字图片。

ImageButton同样也有onClick()监听事件,并且同样可以以上述方式实现监听器。

posted on 2016-07-19 16:59  Rocking7189  阅读(188)  评论(0)    收藏  举报

导航