AndroidDev 板


LINE

首先感谢G大的详细说明,呵呵~感激不尽。 说到最後,其实这两种方式相似度99%。哈哈~ 匿名类别的写法,跟匿名物件(有点模糊@@)这两者之间我想我应该再多花点时间了解~ 最後~感谢您。0.0 ※ 引述《givemepass (〆)》之铭言: : ※ 引述《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); : } : private MyOnClickListener1 myOnClickListener1 = new MyOnClickListener1(); : private MyOnClickListener2 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"); : } : } : 你会被编译器挡下来, 因为在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(myOnClickListener1); : button2.setOnClickListener(myOnClickListener2); : } : private class OnClickListener myOnClickListener1 : = new MyOnClickListener1(){ : public void onClick(View v){ : textView1.setText("textview1"); : } : } : private class OnClickListener myOnClickListener2 : = new MyOnClickListener2(){ : 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 MyOnClickListener1(){ : public void onClick(View v){ : textView1.setText("textview1"); : } : }); : button2.setOnClickListener(new MyOnClickListener2(){ : public void onClick(View v){ : textView2.setText("textview2"); : } : }); : } : } : 整个世界乾净多了! : 现在你知道为什麽要这样写了吗? --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.55.241
1F:→ nonebelieve:其实你可以推文或寄站内信感谢他就好.. 01/10 11:32







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP