谢谢大家的答案和时间!
您好,
我一直在尝试从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,它不是静态函数。
答案 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()并发送合适的视图