作者sweet00914 (别理我)
看板AndroidDev
标题Re: [问题] onClickListener的事件处理?
时间Tue Jan 10 11:21:55 2012
首先感谢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