作者givemepass (〆)
看板AndroidDev
标题Re: [问题] onClickListener的事件处理?
时间Tue Jan 10 10:38:24 2012
※ 引述《sweet00914 (别理我)》之铭言:
: MyListener ml=new MyListener();
: F1 = (Button) findViewById(R.id.bottomBtnF1);
: F1.setOnClickListener(ml);
: private class MyListener implements OnClickListener{
: public void onClick(View v) {
: }
: }
: ==========================================================
: F1 = (Button) findViewById(R.id.bottomBtnF1);
: F1.setOnClickListener(btnclick);
: private OnClickListener btnclick=new OnClickListener(){
: public void onClick(View v) {
: }
: }
: 上述两种写法均可执行,第一种方式是将onClick的事件以Class来表示,
: 第二种方式是以function来表示。
: 请问大家此两种写法在android上还有其他涵义吗?谢谢
假设你有两个元件要建立事件
也许你会这样做
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
textView1 = (TextView)findViewById(R.id.text_view1);
textView2 = (TextView)findViewById(R.id.text_view2);
class MyOnClickListener implements OnClickListener{
public void onClick(View v){
textView1.setText("textview1");
}
public void onClick(View v){
textView2.setText("textview2");
}
}
private MyOnClickListener myOnClickListener = new MyOnClickListener();
button1.setOnClickListener(myOnClickListener);
button2.setOnClickListener(myOnClickListener);
不! 你不能这样做, 因为你不能在同一个类别内实作同一个方法两次,
而且你会被编译器挡下, 那怎麽办呢?
也许可以这样做
class MyOnClickListener implements OnClickListener{
public void onClick(View v){
if(v.getId()==R.id.btn1){
textView1.setText("textview1");
}
else if(v.getId()==R.id.btn2){
textView2.setText("textview2");
}
}
}
甚至比较乾净的做法是
class MyOnClickListener implements OnClickListener{
public void onClick(View v){
switch(v.getId()){
case R.id.btn1:
textView1.setText("textview1");
break;
case R.id.btn2:
textView2.setText("textview2");
break;
}
}
}
最後在补上
private MyOnClickListener myOnClickListener = new MyOnClickListener();
button1.setOnClickListener(myOnClickListener);
button2.setOnClickListener(myOnClickListener);
看起来似乎不错, 但是万一某一天我想要改变某个动作,
那又等重新修改整段程式码的事件, 也许手残会把其他的事件弄乱,
这样一点也不好。
那如果这样呢? 分别写在不同的类别
public class MyActivity extends Activity{
public void onCreate(){
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
textView1 = (TextView)findViewById(R.id.text_view1);
textView2 = (TextView)findViewById(R.id.text_view2);
myOnClickListener1 = new MyOnClickListener1();
myOnClickListener2 = new MyOnClickListener2();
button1.setOnClickListener(myOnClickListener1);
button2.setOnClickListener(myOnClickListener2);
}
private MyOnClickListener1 myOnClickListener1;
private MyOnClickListener2 myOnClickListener2;
}
class MyOnClickListener1 implements OnClickListener{
public void onClick(View v){
textView1.setText("textview1");
}
}
class MyOnClickListener2 implements OnClickListener{
public void onClick(View v){
textView2.setText("textview2");
}
}
你会被编译器挡下来, 因为在MyOnClickListener1和MyOnClickListener2并不存在
textView1跟textView2这两个类别成员。
所以我们又想到一个好办法, 那就是把事件类别写在我们要处理事件的类别内,
改成这样就没问题了! 内部类别
public MyActivity extends Activity{
private TextView textView1;
private TextView textView2;
private MyOnClickListener1 myOnClickListener1;
private MyOnClickListener2 myOnClickListener2;
public void onCreate(){
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
textView1 = (TextView)findViewById(R.id.text_view1);
textView2 = (TextView)findViewById(R.id.text_view2);
myOnClickListener1 = new MyOnClickListener1();
myOnClickListener2 = new MyOnClickListener2();
button1.setOnClickListener(myOnClickListener1);
button2.setOnClickListener(myOnClickListener2);
}
class MyOnClickListener1 implements OnClickListener{
public void onClick(View v){
textView1.setText("textview1");
}
}
class MyOnClickListener2 implements OnClickListener{
public void onClick(View v){
textView2.setText("textview2");
}
}
}
类别内的类别称作inner class, 那inner class称呼包着它的类别就叫做outer class,
inner class可以使用outer class的任何成员,就算是private的也是可行,
如上面的例子, 内部类别可以取用textView1,textView2。
但是!
写程式总是会想要偷懒, 少写几行又能完成相同的功能,
那我们就会开始想办法偷懒,
你有没有发现每次都要宣告类别, 定义要处理的事件,
然後在宣告实体, 最後将实体配置给某个元件的监听器,
有够麻烦的,
因此我们就会想,
不如把定义事件跟宣告该事件类别的物件一起写,
这样不就方便多了?
所以改成这样, 也许会好一点!
public MyActivity extends Activity{
private TextView textView1;
private TextView textView2;
//private MyOnClickListener1 myOnClickListener1;
//private MyOnClickListener2 myOnClickListener2;
public void onCreate(){
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
textView1 = (TextView)findViewById(R.id.text_view1);
textView2 = (TextView)findViewById(R.id.text_view2);
//myOnClickListener1 = new MyOnClickListener1();
//myOnClickListener2 = new MyOnClickListener2();
button1.setOnClickListener(mOnClickListener1);
button2.setOnClickListener(mOnClickListener2);
}
private OnClickListener mOnClickListener1
= new OnClickListener(){
public void onClick(View v){
textView1.setText("textview1");
}
};
private OnClickListener mOnClickListener2
= new OnClickListener(){
public void onClick(View v){
textView2.setText("textview2");
}
};
}
嗯...少写几行的感觉真爽!
但是全联先生说:省还可以更省。
如果我们再将定义事件类别宣告的变数省起来,
直接写进setOnClickListener, 不是更好吗?
因此终极省法出现了! 匿名类别物件
public MyActivity extends Activity{
private TextView textView1;
private TextView textView2;
public void onCreate(){
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
textView1 = (TextView)findViewById(R.id.text_view1);
textView2 = (TextView)findViewById(R.id.text_view2);
button1.setOnClickListener(new OnClickListener(){
public void onClick(View v){
textView1.setText("textview1");
}
});
button2.setOnClickListener(new OnClickListener(){
public void onClick(View v){
textView2.setText("textview2");
}
});
}
}
整个世界乾净多了!
现在你知道为什麽要这样写了吗?
1F:→ diousk:推~我想重点应该是:在不同情况该用什麽方法让程式更简洁~01/10 15:55
我想推楼上这句话
的确我们有时候必须考虑到很多种情况
来挑是否使用匿名类别物件
今天假设你有一百个Button 且 事件内容都相同 这种情况下
就不可能使用匿名类别物件了
因为你会写到疯掉
Button[] button = new Button[100];
buttton[0].setOnClickListener(new OnClickListener(){
public void onClick(View v){
textView.setText("hello");
}
});
buttton[1].setOnClickListener(new OnClickListener(){
public void onClick(View v){
textView.setText("hello");
}
});
....100次
你会说 反正复制贴上而已 很快!
那万一今天你想修改事件内容呢? 你会改到疯掉
所以比较好的做法反而是之前的宣告一个事件物件
然後用for回圈去注册事件
private OnClickListener mOnClickListener = new OnClickListener(){
public void onClick(View v){
textView.setText("ya");
}
};
for(int i=0;i<button.length;i++){
button[i].setOnClickListener(mOnClickListener);
}
如果你想改事件, 那麽就直接改里面的事件罗,
所以看情况来决定使用的方法才是一个重点!
PS 程式码没编译过 我只是凭印象打出来的
因此如果有小错误出现 请看错误讯息作修正或者提醒我一下吧 感谢:)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.221.115.4
2F:推 terrybob:这篇很值得m的…对於新手的我来说,受教不少… 01/10 11:20
3F:推 Eior:推一个 01/10 11:48
4F:推 jain00:请m一下,笔记中 01/10 12:36
5F:推 mamaya3:写得真清楚..我也是用了好一阵子才悟懂其中的意义XD 01/10 14:21
6F:→ diousk:推~我想重点应该是:在不同情况该用什麽方法让程式更简洁~ 01/10 15:55
※ 编辑: givemepass 来自: 61.221.115.4 (01/11 10:23)
7F:推 kenliner:写的好棒、只能说 这就是经验。 01/12 16:35
8F:→ godpro:抄笔记中... 01/13 22:36
9F:推 trans7749:推!! 02/04 17:01