将java侦听器分离为自己的函数?

时间:2012-12-21 02:06:44

标签: java android

我可以将set-listener行分成小块吗?

这是我的代码:

protected void onCreate(Bundle savedInstanceState) {
   Preference button = (Preference)getPreferenceManager().findPreference("exitlink");      

      button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
             @Override
             public boolean onPreferenceClick(Preference arg0) {
                finish();   
                return true;
             }
        });     

我希望这看起来像:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Preference button = (Preference)getPreferenceManager().findPreference("exitlink");      
    if(button != null) {
         button.setOnPreferenceClickListener(onPreferenceClick);
    }        
}

public boolean onPreferenceClick(Preference arg0) {
    finish();   
    return true;
}

4 个答案:

答案 0 :(得分:2)

您还可以在方法之外创建变量:

    private Preference.OnPreferenceClickListener listener = new Preference.OnPreferenceClickListener() {
         @Override
         public boolean onPreferenceClick(Preference arg0) {
            finish();   
            return true;
         }
    };

然后将其用作变量:setListener(listener)。这将允许您在Activity中拥有同一个侦听器类的多个实例。

答案 1 :(得分:1)

上面的代码几乎已经有效了。使用上面的代码进行这一微小的改动:

button.setOnPreferenceClickListener(this);

然后,您只需让您的类实现所需的特定接口,在本例中为Preference.OnPreferenceClickListener

除了下面关于为此使用变量的dmon建议之外,还可以编写一个返回一个监听器的函数,当你想要有类似的监听器但稍有改动时这是非常有用的,比如以下示例。

private Preference.OnPreferenceClickListener getListener(int listenerId) {
    return new Preference.OnPreferenceClickListener() {
         @Override
         public boolean onPreferenceClick(Preference arg0) {
            Log.i("MyTag", "Listener " + listenerId + " invoked!");
            finish();   
            return true;
         }
    };
}

答案 2 :(得分:1)

正如其他人所提到的,即使您无法将方法名称传递给setOnPreferenceClickListener,您也可以创建一个扩展Preference.OnPreferenceClickListener的类型的变量。在您的原始代码中,这实际上就是您正在做的事情:您正在创建anonymous inner class的对象。

这种方法的优势,比如上面的SimonAndréForsberg的answer所说的范围是:它将侦听器的功能保留在那个小块中,而不是整个类中。

在dmon的answer中创建方法之外的单独变量会失去匿名内部类的一大好处,即它们可以访问包含范围中的变量:在原始代码中,侦听器可以访问变量buttonsavedInstanceState。对于在函数外部定义的单独变量,这是不可能的。

这些都不意味着您必须使用匿名内部类。 Oracle有一个名为General Information about Writing Event Listeners的优秀教程,您将从中受益匪浅。

答案 3 :(得分:0)

不完全是。 set-listener需要一个侦听器实例,因此您始终需要创建一个侦听器。我不认为这是实现监听器接口的活动的好方法。

解决方法是您可以使用带有反射的注释,例如http://code.google.com/p/roboguice/。这可能会使代码更清晰,但也会引入依赖关系。