Day5、五种不同的事件监听器

所有用户界面是用和用户交互的,所以点击事件非常重要,而实现的方法则是通过添加事件监听器,来编写具体的逻辑代码实现,所以从简单的按钮开始,学懂和学通添加时间监听器的方法对应开发人员来说,非常重要

一、采用匿名内部类的方法

1.incident.xml代码,很简单。

<?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/btn_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn_show"
        android:textSize="14sp"
        android:textColor="#00f"
        android:layout_marginTop="10dp"/>

</LinearLayout>

2.MainActivity.java代码。

package com.zero.buttonincident;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {
    /*
     * 直接使用匿名内部类 new出View的接口【new View.OnClickListener(......);】
     * 1、声明获取控件对象(一般Activity中有很多控件,控件与控件直接有很多交互,为了引用方便,因此声明为全局变量)
     * 2、注册(设置)监听器
     * 3、重写方法,编写相应逻辑代码
     */
    private Button btn_show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.incident);
        //1、
        btn_show=(Button) findViewById(R.id.btn_show);
        //2、
        btn_show.setOnClickListener(new View.OnClickListener() {
            //匿名内部类,View类的接口
            //context:指的是当前类的实例化对象
            @Override
            //3、
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "您点击了按钮", Toast.LENGTH_LONG).show();
                Log.i("zwb", "您点击了按钮");
            }
        }); 
    }
}

3.运行结果(Toast和Log日志)
这里写图片描述
这里写图片描述

二、让主类(MainActivity1)继承接口(OnClickListener)的方法

1.incident.xml代码,和1中相同,省略。
2.MainActivity1.java代码

package com.zero.buttonincident;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity1 extends Activity implements OnClickListener {
    /*
     *让主类(MainActivity1)继承接口(OnClickListener)添加事件监听器的一般步骤
     *1、获取控件对象(一般Activity中有很多控件,控件与控件直接有很多交互,为了引用方便,因此设置为全局变量)
     *2、注册(设置)监听器 btn_show.setOnClickListener(this);
     *3、重写onClick方法,编写具体的逻辑代码
     *
     */

    private Button btn_show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.incident);//设置此MainActivity1所显示的布局
        //1、
        btn_show=(Button) findViewById(R.id.btn_show);
        //2、
        btn_show.setOnClickListener(this);/*监听器类型必须是接口类型(其中参数this是当前类的对象,即MainActivity1此类
                                            因此需要让其继承相应接口,并重写方法)*/

    }
    //3、
    @Override
    public void onClick(View arg0) {
        Toast.makeText(this, "您点击了按钮,两个this都是实相应接口类的对象", Toast.LENGTH_LONG).show();
        Log.i("zwb", "您点击了按钮");
    }
}

3.运行结果
这里写图片描述

三、在.xmlButton属性中添加android:onClick=”自定义的方法名”

1.贴.xml代码

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

    <!--在.xml中直接添加属性android:onClick="btnClick"引号中是方法名  -->

    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn_show"
        android:textSize="14sp"
        android:textColor="#00f"
        android:layout_marginTop="10dp"
        android:onClick="btnClick"/>

</LinearLayout>

2.贴MainActivity2.java 代码

package com.zero.buttonincident;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class MainActivity2 extends Activity  {

    /*
     * 最简单的方法,只需要两步便可完成
     * 1、在.xml添加事件属性: android:onClick="btnClick"
     * 2、在主MainActivity2类中重写:public void btnOclick(View v){.....}
     */

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.incident1);//设置此MainActivity1所显示的布局
    }

    //完全自定义的
    public void btnClick(View arg0){
        String text="您点击了按钮,这是最简单的方法!!";
        Toast.makeText(this, text, Toast.LENGTH_LONG).show();
        Log.i("zwb", "您点击了按钮");
    }

}

3.运行结果
这里写图片描述

四、使用内部类来实现

1.incident.xml文件代码

<?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/btn_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn_show"
        android:textSize="14sp"
        android:textColor="#00f"
        android:layout_marginTop="10dp"/>

</LinearLayout>

2.MainActivity3.java文件代码

package com.zero.buttonincident;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity3 extends Activity {
    /*
     *使用内部类
     *1、定义一个内部类,实现View.OnClickListener接口,并重写onClick()方法
     *2、在绑定事件监听器时,直接new一个内部类对象作为参数
     */

    private Button btn_show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.incident);//设置此MainActivity1所显示的布局

        btn_show=(Button) findViewById(R.id.btn_show);
        btn_show.setOnClickListener(new btnClickListener());/*监听器类型必须是接口类型*/
    }

    class btnClickListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            String text ="您点击了按钮,使用内部类来实现";
            Toast.makeText(MainActivity3.this, text, Toast.LENGTH_LONG).show();
            Log.i("zwb", text);
        }
    }
}

3.运行结果
这里写图片描述
这里写图片描述

五、使用外部类来实现

1.在incident2.xml文件中加入垂直居中的TextView,来代替Toast显示文字

<?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/btn_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn_show"
        android:textSize="14sp"
        android:textColor="#00f"
        android:layout_marginTop="10dp"/>
    <TextView 
        android:id="@+id/tv_show"
        android:gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

2.外部类OutClick.java代码

package com.zero.buttonincident;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class OutClick implements OnClickListener{
     private TextView textshow;    
        //利用构造方法把文本框作为参数传入,通过 textshow.setText();来设置显示内容
        public OutClick(TextView text)    
        {    
            textshow = text;    
        }
    @Override
    public void onClick(View v) {
        textshow.setText("点击了按钮,采用外部类来实现");
    }

}

3.MainActivity.java代码

package com.zero.buttonincident;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity4 extends Activity {

    private Button btn_show;
    private TextView textshow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.incident2);//设置此MainActivity1所显示的布局

        btn_show=(Button) findViewById(R.id.btn_show);
        textshow=(TextView)findViewById(R.id.tv_show);

        //直接new一个外部类,并把TextView作为参数传入
        btn_show.setOnClickListener(new OutClick(textshow));/*监听器类型必须是接口类型*/
    }
}

4.运行结果
这里写图片描述

心得总结一、给按钮添加监听器的基本步骤

1、声明获取控件对象
2、注册(设置)监听器
3、重写方法,编写相应逻辑代码

心得总结二、监听器类型是接口类型,并重写接口里面的方法,从上面可以看出来,不论哪种方法,都会实现对应的接口,匿名内部类通过View点出的。

心得总结三、关键字this:this都是实相应接口类的对象。在传入是要注意是不是当前所实现对应接口的类的对象,来context上写文。(易错点)

心得总结四、5中方法的比较

1、匿名内部类:在Toast是注意context上下文的this容易出错,此方法被控件绑死了,复用性差.
2、让主类(MainActivity1)继承接口(OnClickListener)的方法
3、给控件设置属性:代码贼简单,但是不变与维护,容易出bug,比如在.java文件中将方法名该一下,代码不会报错,甚至能运行,但是会停止运行的。
4、内部类的方法:该类中进行复用,可直接访问外部类的所有界面组件。灵活有利于代码的重用。
5、外部类的方法:因为外部类不能直接访问用户界面 类中的组件,要通过构造方法将组件传入使用;这样导致的结果就是代码不够简洁。

心得总结五、关于2、和4、方法的代码

1.xml文件

<?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">
    <EditText 
        android:id="@+id/et_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/et_show"
        android:inputType="text"/>
    <Button 
        android:id="@+id/btn_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn_show"
        android:textSize="14sp"
        android:textColor="#00f"
        android:layout_marginTop="10dp"/>

     <Button 
        android:id="@+id/btn_show1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn_show1"
        android:textSize="14sp"
        android:textColor="#00f"
        android:layout_marginTop="10dp"/>

</LinearLayout>

2.java文件

package com.zero.buttonincident;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity5 extends Activity implements OnClickListener {
    /*
     *让主类(MainActivity1)继承接口(OnClickListener)添加事件监听器的一般步骤
     *1、获取控件对象(一般Activity中有很多控件,控件与控件直接有很多交互,为了引用方便,因此设置为全局变量)
     *2、注册(设置)监听器 btn_show.setOnClickListener(this);
     *3、重写onClick方法,编写具体的逻辑代码
     *4、巧用switch...case语句,转换id
     */

    private Button btn_show;
    private Button btn_show1;
    private EditText et_show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.incident3);//设置此MainActivity1所显示的布局

        btn_show=(Button) findViewById(R.id.btn_show);
        btn_show1=(Button) findViewById(R.id.btn_show1);
        et_show=(EditText) findViewById(R.id.et_show);

        btn_show.setOnClickListener(this);
        btn_show1.setOnClickListener(this);/*监听器类型必须是接口类型,this是当前主类的对象,此类实现了相应的接口*/

    }

    @Override
    public void onClick(View v) {
        String text=et_show.getText().toString();

        //编程技巧,使用switch...case语句来切换事件源,参数v一般指的事件源
        switch(v.getId()){
        case R.id.btn_show:
            text+="点我按钮";
            break;
        case R.id.btn_show1:
            text+="戳我按钮";
            break;
        }
        Toast.makeText(this,text, Toast.LENGTH_LONG).show();
        Log.i("zwb", text);
    }
}

3.运行结果,由于敲代码时间有点长,hello写错了。。。
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值