所有用户界面是用和用户交互的,所以点击事件非常重要,而实现的方法则是通过添加事件监听器,来编写具体的逻辑代码实现,所以从简单的按钮开始,学懂和学通添加时间监听器的方法对应开发人员来说,非常重要
一、采用匿名内部类的方法
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写错了。。。