簡體   English   中英

從不同的類調用非靜態方法(位於主類中)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM