【问题标题】:Calling a non-static method in an android OnPreferenceClickListener在 android OnPreferenceClickListener 中调用非静态方法
【发布时间】:2015-07-27 18:56:54
【问题描述】:
/**
 * 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() {

        }
    }
}

在上面这样的代码sn-p中,我需要调用一个非静态方法,或者创建一个AlertDialog()。由于侦听器是静态方法,因此我都很难做到。

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

提前致谢

【问题讨论】:

  • 为什么它需要是静态的?
  • 我不确定是否必须如此。我有一个 PreferencesActivity 并且需要监听对特定偏好的单击(或在另一个实例中更改)。到目前为止,我发现这样做的唯一方法是 Preference.OnPreferenceClickListener 或 Preference.onPreferenceChangeListener,它们都是静态的。如果我能找到另一种方法来解决我的问题

标签: java android static listener preferences


【解决方案1】:

您可以将 Preference.OnPreferenceClickListener 静态实现到您自己的类中,并在准备好后从您的活动代码中对其进行初始化。 (我假设您出于某种原因需要侦听器对象是静态的,您可以取消它!)

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

希望代码结构清晰。

【讨论】:

  • 惊人的解决方案!非常感谢!
【解决方案2】:

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

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例子,我想你可以用这种方式创建一个对象,并用它引用成静态方法。 希望对你有帮助。

【讨论】:

  • 感谢您的回复。我明白了,问题基本上是偏好监听器是静态的,我似乎无法绕过。它更多的是滥用android api而不是java困境。
【解决方案3】:

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

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

public class Foo {
    public static class Bar {
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2023-03-15
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多