onClick事件:
1、Button,ImageButton都拥有onClick事件,由自身的.setOnClickListener(OnClickListener)方法添加点击事件;
2、所有的控件都有onClick事件,并不仅仅是按钮控件有;
3、通过点击事件的监听可以实现点击按钮之后要发生什么动作。
监听事件实现的几种写法:
1、匿名内部类的实现;
public class MainActivity extends Activity {
private Button loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* 初始化当前所需要的控件
* 用findViewById---返回的是一个View的对象
* findViewById是如何找到对应的View的Id呢?
*/
loginButton=(Button) findViewById(R.id.button1);
//监听事件通过第一种方法实现:匿名内部类
loginButton.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
//在当前onClick方法中监听点击Button的动作
System.out.println("我的Button被点击了");
}
});
}
}
2、独立类的实现;
public class MainActivity extends Activity {
private Button loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* 初始化当前所需要的控件
* 用findViewById---返回的是一个View的对象
* findViewById是如何找到对应的View的Id呢?
*/
loginButton=(Button) findViewById(R.id.button1);
//独立类的写法
loginButton.setOnClickListener(new MyOnClickListener(){
public void onClick(View arg0) {
//调用父类的onClick
super.onClick(arg0);
Toast.makeText(MainActivity.this, "button", 1).show();
};
} );
}
}
//OnClickListener是一个接口,所以不能继承
class MyOnClickListener implements OnClickListener{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Log.i("tag","父类的onClick事件");
}
}
这样写的好处是,当我有很多歌按钮,这些按钮在执行自己独有的操作的时候,还需要执行一个相同的操作,那么这个相同的操作就可以写在外部类的逻辑中。例如,我当我点击按钮的时候我希望我点击的这个按钮变成半透明,我们就可以把半透明的代码写在独立类中。
public class MainActivity extends Activity {
private Button loginButton1;
private Button loginButton2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* 初始化当前所需要的控件
* 用findViewById---返回的是一个View的对象
* findViewById是如何找到对应的View的Id呢?
*/
loginButton1=(Button) findViewById(R.id.button1);
loginButton2=(Button) findViewById(R.id.button2);
//独立类的写法
loginButton1.setOnClickListener(new MyOnClickListener(){
public void onClick(View arg0) {
//调用父类的onClick
super.onClick(arg0);
Toast.makeText(MainActivity.this, "button1", 1).show();
};
} );
loginButton1.setOnClickListener(new MyOnClickListener(){
public void onClick(View arg0) {
//调用父类的onClick
super.onClick(arg0);
Toast.makeText(MainActivity.this, "button2", 1).show();
};
} );
}
}
//OnClickListener是一个接口,所以不能继承
class MyOnClickListener implements OnClickListener{
@Override
public void onClick(View arg0) {
arg0.setAlpha(0.5f);
}
}
3、实现接口的方式来实现。
public class MainActivity extends Activity implements OnClickListener {
private Button loginButton1;
private ImageButton imagBt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* 初始化当前所需要的控件
* 用findViewById---返回的是一个View的对象
* findViewById是如何找到对应的View的Id呢?
*/
loginButton1=(Button) findViewById(R.id.button1);
imagBt=(ImageButton) findViewById(R.id.imageButton1);
//通过实现一个接口的方式实现监听事件
loginButton1.setOnClickListener(listener);
imagBt.setOnClickListener(listener);
}
//实现OnClickListener接口
OnClickListener listener=new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "Click", 1).show();
}
};
@Override
public void onClick(View arg0) {
Log.i("tag","Hello");
}
}
补充:
1、其实我们看到的是Botton,其实他们都是View,也就是说View是所有控件的父类。
2、findViewById---返回的是一个View的对象,所有在src文件夹下的资源都会在R文件中有唯一的Id,此函数就是通过R文件找到的对应的button。
public static final int button1=0x7f080000;
所以我们访问R.id.button1访问的就是它对应的地址。
3、OnClickListener是一个接口,以上三种方式是通过不同的方法实现这个接口并加以利用的过程,方法一是匿名内部类实现,方法二是通过外部独立类实现,方法三是在当前类内部实现接口。