Java 在android OnPreferenceClickListener中调用非静态方法

Java 在android OnPreferenceClickListener中调用非静态方法,java,android,static,listener,preferences,Java,Android,Static,Listener,Preferences,在上面这样的代码片段中,我需要调用一个非静态方法,或者创建一个AlertDialog()。因为侦听器是一个静态方法,所以我很难做到这两个方面 /** * A preference change listener to resynchronize a contact list * */ private static Preference.OnPreferenceClickListener resynchronizeContactsListener = new Preference.OnPre

在上面这样的代码片段中,我需要调用一个非静态方法,或者创建一个AlertDialog()。因为侦听器是一个静态方法,所以我很难做到这两个方面

/**
 * A preference change listener to resynchronize a contact list
 *
 */
private static Preference.OnPreferenceClickListener resynchronizeContactsListener = new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) {
        new AlertDialog() {

        }
    }
}
例如,AlertDialog.Builder()构造函数需要创建一个android上下文对象,但由于该方法是静态的,因此没有上下文。我考虑将上下文作为参数传递,但是我不确定在不破坏重写方法这一事实的情况下在何处传递


提前感谢

基本上,静态方法不能调用非静态方法,但我们可以使用引用,其中包括对静态方法的非静态方法

/**
 * A preference change listener to resynchronize a contact list
 *
 */
private static Preference.OnPreferenceClickListener resynchronizeContactsListener = new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) {
        new AlertDialog() {

        }
    }
}
这是一个java示例,我认为可以使用这种方式创建对象,并将其引用到静态方法中。
希望它能对您有所帮助。

您可以实现首选项。在首选项上,静态地单击Listener到您自己的类中,并在准备就绪时从活动代码对其进行初始化。(我假设出于某种原因您需要listener对象是静态的,您可以去掉它!)

然后在活动代码中执行以下操作:

private static MyPrefListener myPrefListener = null;

private static class MyPrefListener implements Preference.OnPreferenceClickListener {

    private Context mContext;
    public MyPrefListener(Context context) {
        this.mContext = context;
    }

    @Override
    public boolean onPreferenceClick(Preference preference) {
        //USE mContext as the context object here
        return false;
    }
}

我希望代码的结构清晰。

只需从声明中删除
static
关键字即可

当类或接口(注意,不是实际的实例化对象,只是类定义)是一个内部类,但没有对其包含类的引用时,它被声明为静态的。乙二醇

myPrefListener = new MyPrefListener(this);

Bar不能引用Foo的任何状态,可以使用
new Foo.Bar()
单独实例化

为什么它需要是静态的?我不确定它是否必须是静态的。我有一个PreferencesActivity,需要监听特定偏好的点击(或在另一个实例中的更改)。到目前为止,我找到的唯一方法是Preference.OnPreferenceClickListener或Preference.onPreferenceChangeListener,两者都是静态的。如果我能找到另一种方法来解决我的问题,谢谢你的回复。我明白这一点,问题基本上是偏好监听器是静态的,我似乎无法绕过它。这更多的是一个误用android api的问题,而不是一个java难题。惊人的解决方案!非常感谢你!
public class Foo {
    public static class Bar {
    }
}