有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在安卓 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()构造函数需要创建安卓上下文对象,但由于该方法是静态的,因此没有上下文。我考虑将上下文作为参数传递,但是我不确定在不破坏重写方法这一事实的情况下在何处传递

提前谢谢


共 (3) 个答案

  1. # 1 楼答案

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

    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示例,我认为可以使用这种方式创建对象,并将其引用到静态方法中。 希望它能帮助你

  2. # 2 楼答案

    您可以实现首选项。在首选项上,静态地将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;
        }
    }
    

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

    myPrefListener = new MyPrefListener(this);
    

    我希望代码的结构清晰

  3. # 3 楼答案

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

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

    public class Foo {
        public static class Bar {
        }
    }
    

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