6

要处理事件,有两种方法:

  1. 实现回调接口,例如

    public class A implements View.OnClickListener {
        public void onClick(View v) {
            ....
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            aboutLayout = (LinearLayout) findViewById(R.id.aboutLayout);
            aboutLayout.setOnClickListener(this);
        }
    }
    
  2. 创建实现回调接口的内部类

    public class ActivityAbout  {
        private class ViewClickListener implements View.OnClickListener {
            public void onClick(View v) {
                ..
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            ViewClickListener listener = new ViewClickListener();
            aboutLayout = (LinearLayout) findViewById(R.id.aboutLayout);
            aboutLayout.setOnClickListener(listener);
        }
    }
    

哪一个更好?

4

2 回答 2

4

选择完全取决于您计划使用该类的方式,每种方法都是有效的并且有其相应的优点和缺点:

  • 方法 1 可以快速编写代码,但将您限制在一个onClick()功能上,这可能会或可能不会成为组织混乱。
  • 方法 2 允许您创建多个onClick()函数并以更合乎逻辑的方法使用它们。

但我想介绍方法 3,一个匿名回调:

public class MyActivity extends Activity {
    OnClickListener myClickListener1 = new OnClickListener() {
        public void onClick(View v) {
            ..
        }
    }

    OnClickListener myClickListener2 = new OnClickListener() {...}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        view.setOnClickListener(myClickListener1);
    }
}

请注意,与方法 2 不同,我没有创建自定义类。除非您要添加更多功能、保留局部变量或以其他方式修改 OnClickListener 的基本功能,否则我会避免创建新的自定义类。

于 2012-09-09T19:30:29.367 回答
1

如果代码很长(并且需要组织或方法化),或者如果我打算一遍又一遍地使用相同的代码,我倾向于使用内部类。Surface为了清楚起见,甚至我的回调也被组织为内部类。

如果代码简短且易于处理(可能只是事件中的一行),我会使用匿名类。

如果事件与类本身直接相关,我只会使用第一个实现,并且永远不需要附加其他侦听器。这是一种非常罕见的情况。(我也将它用于简单的调试,但这在这里无关紧要。)

于 2012-09-09T19:29:18.587 回答