我可以将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;
}
答案 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中创建方法之外的单独变量会失去匿名内部类的一大好处,即它们可以访问包含范围中的变量:在原始代码中,侦听器可以访问变量button
和savedInstanceState
。对于在函数外部定义的单独变量,这是不可能的。
这些都不意味着您必须使用匿名内部类。 Oracle有一个名为General Information about Writing Event Listeners的优秀教程,您将从中受益匪浅。
答案 3 :(得分:0)
不完全是。 set-listener需要一个侦听器实例,因此您始终需要创建一个侦听器。我不认为这是实现监听器接口的活动的好方法。
解决方法是您可以使用带有反射的注释,例如http://code.google.com/p/roboguice/。这可能会使代码更清晰,但也会引入依赖关系。