[英]Call non-static method (located in main class) from different class
謝謝大家的回答和時間!
你好,
我一直在嘗試從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。
Dmarks是您的主要Application
類? 您不應該嘗試在Activity
實例化它。 而是在Activity中使用getApplication函數獲取當前實例。
您將需要將其強制轉換為您的子類類型:
DMark dmark = (DMark)getApplication();
dmark.queryBookmarks();
使Dmarks
實現Preference.OnPreferenceChangeListener
。 然后,您將擁有正確初始化的上下文。
context
來自哪里? 聽起來好像是context
為空,這是一個例外。 您是否需要自己將context
注入Dmarks
實例? 不知何故,需要設置該值。
還有,這樣的代碼有什么意義
Object d = new Dmarks();
((Dmarks) d).queryBookmarks();
不只是寫作
Dmarks d = new Dmarks();
d.queryBookmarks();
?
Contex可能不是null,但看起來好像缺少了什么,為什么不嘗試將主類的實際實例注入Prefernces中呢?
//in main
preferncesInstance.setDmarks(this);
然后,您可以在工作實例上調用queryBook ...
我認為您還必須調用Toast setView()並發送適當的視圖
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.