在 android OnPreferenceClickListener 中调用非静态方法

Calling a non-static method in an android OnPreferenceClickListener

/**
 * 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()。由于侦听器是静态方法,因此我很难做到这两点。

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

提前致谢

基本上,静态方法不能调用非静态方法,但我们可以使用引用,将非静态方法包含到静态方法中。

public class StaticMethodTest{
void NonStaticMethod(){
    System.out.println("This is a non-sataic method.");
}
  static void StaticMethod(StaticMethodTest s){
   System.out.println("This is a static method.");
   s.NonStaticMethod();
}
public static void main(String[] args) {
    StaticMethodTest sObj=new StaticMethodTest();
    StaticMethod(sObj);  
}}

这是一个java的例子,我想你可以用这种方式创建一个对象,并用它引用到静态方法中。 希望对你有帮助。

您可以将 Preference.OnPreferenceClickListener 静态地实现到您自己的 class 中,并在准备就绪时从您的 activity 代码中初始化它。 (我假设您出于某种原因需要侦听器对象是静态的,您可以取消它!)

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;
    }
}

然后在您的 Activity 代码中,执行以下操作:

myPrefListener = new MyPrefListener(this);

希望代码结构清晰

只需从您的声明中删除 static 关键字。

A​​ class 或接口(注意不是实际的实例化对象,只是 class 定义)在内部 class 但没有引用它包含 class。 EG

public class Foo {
    public static class Bar {
    }
}

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

基本上,静态方法不能调用non-static方法,但我们可以使用一个引用,其中包含一个non-static方法到静态方法。

public class StaticMethodTest{
void NonStaticMethod(){
    System.out.println("This is a non-sataic method.");
}
  static void StaticMethod(StaticMethodTest s){
   System.out.println("This is a static method.");
   s.NonStaticMethod();
}
public static void main(String[] args) {
    StaticMethodTest sObj=new StaticMethodTest();
    StaticMethod(sObj);  
}}

这是一个java的例子,我想你可以用这种方式创建一个对象,并用它引用到静态方法中。希望对你有帮助。