1

我可以将 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

4 回答 4

2

You can also create a variable outside of your method:

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

Then you use it as a variable: setListener(listener). This would allow you to have multiple instances of the same listener class in your Activity.

于 2012-12-21T02:15:46.183 回答
1

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

相对于 Simon André Forsberg 的上述回答,这种方法的优势在于范围:它将侦听器功能保留在那个小块中,而不是可能遍布整个班级。

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

这并不意味着您必须使用匿名内部类。Oracle 有一个出色的教程,题为关于编写事件侦听器的一般信息,您将从中受益匪浅。

于 2012-12-21T02:51:38.273 回答
1

Your code above nearly works already. Use your above code with this tiny change:

button.setOnPreferenceClickListener(this);

Then you just let your class implement the specific interface needed, in this case Preference.OnPreferenceClickListener.

In addition to dmon's suggestion below about using variables for this, it is also possible to write a function that returns a listener, which is very useable when you want to have similar listeners but with slight changes, like in the example below.

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;
         }
    };
}
于 2012-12-21T02:12:24.843 回答
0

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

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

于 2012-12-21T02:17:20.270 回答