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

时间:2010-10-18 17:56:56

标签: java android

谢谢大家的答案和时间!

您好,

我一直在尝试从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 个答案:

答案 0 :(得分:4)

Dmarks是您的主要Application课程?您不应该尝试在Activity中对此进行实例化。而是使用Activity中的getApplication函数来获取当前实例。

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

DMark dmark = (DMark)getApplication();
dmark.queryBookmarks();

答案 1 :(得分:2)

改为Dmarks实施Preference.OnPreferenceChangeListener。然后你将有一个正确初始化的上下文。

答案 2 :(得分:0)

context来自哪里?听起来像context为空的例外情况。您是否需要自己将context实例注入Dmarks实例?不知何故,需要设置此值。

此外,像这样的代码有什么意义

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

而不仅仅是写作

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

答案 3 :(得分:0)

Contex可能不是null但看起来它缺少了什么,为什么不尝试将主类的实际实例注入Prefernces?

//in main    
preferncesInstance.setDmarks(this);

然后你可以在工作实例上调用queryBook ......

答案 4 :(得分:0)

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