代码之家  ›  专栏  ›  技术社区  ›  Lior Iluz

从不同的类调用非静态方法(位于主类中)

  •  2
  • Lior Iluz  · 技术社区  · 14 年前

    感谢大家的回答和时间!

    你好,

    我一直试图从Preferences类调用位于主应用程序类中的非静态方法。 因为我调用的方法不是静态的,所以我实例化了主类,然后尝试调用我想要的特定方法,但它是强制关闭的。

    preferences.class(从中调用方法):

    Preference sorted = (Preference) findPreference("sortPref");
            sorted.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    Object d = new mainActivity();
                    ((mainActivity) d).queryBookmarks();
    
                    return true;
                }
            });
    

    我调用的mainActivity.class方法:

        public void queryBookmarks() {
    
            Toast.makeText(context, "blah blah", Toast.LENGTH_LONG).show(); 
    //context is not null and the Toast is working if I  call it from mainActivity.class
    
            }
    

    Logcat:

    E/AndroidRuntime(11718): FATAL EXCEPTION: main
    E/AndroidRuntime(11718): java.lang.NullPointerException
    E/AndroidRuntime(11718):        at android.content.ContextWrapper.getContentReso
    lver(ContextWrapper.java:90)
    E/AndroidRuntime(11718):        at android.app.Activity.managedQuery(Activity.ja
    va:1520)
    E/AndroidRuntime(11718):        at com.queryBookmarks(
    .java:101)
    E/AndroidRuntime(11718):        at com.Preferences$2.onPrefer
    enceChange(Preferences.java:47)
    E/AndroidRuntime(11718):        at android.preference.Preference.callChangeListe
    ner(Preference.java:756)
    E/AndroidRuntime(11718):        at android.preference.ListPreference.onDialogClo
    sed(ListPreference.java:219)
    E/AndroidRuntime(11718):        at android.preference.DialogPreference.onDismiss
    (DialogPreference.java:384)
    E/AndroidRuntime(11718):        at android.app.Dialog$ListenersHandler.handleMes
    sage(Dialog.java:1047)
    E/AndroidRuntime(11718):        at android.os.Handler.dispatchMessage(Handler.ja
    va:99)
    E/AndroidRuntime(11718):        at android.os.Looper.loop(Looper.java:123)
    E/AndroidRuntime(11718):        at android.app.ActivityThread.main(ActivityThrea
    d.java:4627)
    E/AndroidRuntime(11718):        at java.lang.reflect.Method.invokeNative(Native
    Method)
    E/AndroidRuntime(11718):        at java.lang.reflect.Method.invoke(Method.java:5
    21)
    E/AndroidRuntime(11718):        at com.android.internal.os.ZygoteInit$MethodAndA
    rgsCaller.run(ZygoteInit.java:868)
    E/AndroidRuntime(11718):        at com.android.internal.os.ZygoteInit.main(Zygot
    eInit.java:626)
    E/AndroidRuntime(11718):        at dalvik.system.NativeStart.main(Native Method)
    
    D/dalvikvm(11718): GC_FOR_MALLOC freed 4248 objects / 282248 bytes in 40ms
    W/ActivityManager(  244):   Force finishing activity com.package/.Pre
    ferences
    

    感谢你的帮助!:)

    编辑:我不能使querybookmarks()成为静态函数,因为它使用的是android函数managedquery,而不是静态函数。

    5 回复  |  直到 13 年前
        1
  •  4
  •   Cheryl Simon    14 年前

    dmarks是你的首要任务 Application 班级?您不应该尝试在 Activity . 相反,使用 getApplication 在活动中执行函数以获取当前实例。

    您需要将其强制转换为子类类型:

    DMark dmark = (DMark)getApplication();
    dmark.queryBookmarks();
    
        2
  •  2
  •   JRL    14 年前

    制作 Dmarks 实施 Preference.OnPreferenceChangeListener 相反。然后您将拥有一个正确初始化的上下文。

        3
  •  0
  •   matt b    14 年前

    在哪里 context 来自何方?听起来,例外是 语境 是空的。你需要注射 语境 进入你 Dmarks 你自己举例?不知怎么的,这个值需要设置。

    另外,这样的代码有什么意义呢

    Object d = new Dmarks();
    ((Dmarks) d).queryBookmarks();
    

    而不仅仅是写作

    Dmarks d = new Dmarks();
    d.queryBookmarks();
    

    ?

        4
  •  0
  •   Hurda    14 年前

    Contex可能不为空,但看起来缺少一些内容,为什么不尝试将主类的实际实例注入到首选项中?

    //in main    
    preferncesInstance.setDmarks(this);
    

    然后可以在工作实例上调用querybook…

        5
  •  0
  •   mhd2    14 年前

    我认为您还必须调用toast setview()并发送合适的视图