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

来源:互联网 发布:剑灵女刺客捏脸数据 编辑:程序博客网 时间:2024/05/12 06:28

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

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

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写错了。。。
这里写图片描述
这里写图片描述

0 0
原创粉丝点击