从主机调用片段的方法活动

问题描述:

我有一个宿主活动和一个片段。在这个片段中,我有一个更新方法,它从数据库加载AsyncTask中的一些数据并更新GridView。从主机调用片段的方法活动

当我打电话从主机活动这种方法有时我得到一个NullPointerExeption,我不知道为什么...

下面是活动的方法,它是一个接口:

@Override 
public void onDataSetChange() { 

    ((CalendarFragment) getSupportFragmentManager().findFragmentByTag(Constants.FRAGMENT_CALENDAR_TAG)).updateGridView(); 
} 

而且该片段的更新方法:

public void updateGridView() { 

    // Loading the new updated data 
    mLoadingTask = new LoadingDataTask(); 
    mLoadingTask.execute((Void) null); 
} 

这里是在logcat的例外:

04-17 12:05:28.366:E/AndroidRuntime(17789):致命例外:main 04-17 12:05:28.366:E/AndroidRuntime(17789):java.lang.NullPointerException 04-17 12:05:28.366:E/AndroidRuntime(17789):at com.sk.neverforget.MainActivity.onDataSetChange(MainActivity.java:397) 04-17 12:05:28.366:E/AndroidRuntime(17789):at com。 sk.neverforget.fragments.DiaryFragment $ StoringDataTask.onPostExecute(DiaryFragment.java:543) 04-17 12:05:28.366:E/AndroidRuntime(17789):at com.sk.neverforget.fragments.DiaryFragment $ StoringDataTask.onPostExecute( DiaryFragment.java:1) 04-17 12:05:28.366:E/AndroidRuntime(17789):at android.os.AsyncTask.finish(AsyncTask.java:631) 04-17 12:05:28.366:E/AndroidRuntime(17789):在android.os.AsyncTask.access $ 6 00(AsyncTask.java:177) 04-17 12:05:28.366:E/AndroidRuntime(17789):at android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:644) 04-17 12:05: 28.366:E/AndroidRuntime(17789):at android.os.Handler.dispatchMessage(Handler.java:99) 04-17 12:05:28.366:E/AndroidRuntime(17789):at android.os.Looper.loop( Looper.java:137) 04-17 12:05:28.366:E/AndroidRuntime(17789):at android.app.ActivityThread.main(ActivityThread.java:5039) 04-17 12:05:28.366:E/AndroidRuntime(17789):在java.lang.reflect.Method.invokeNative(本地方法) 04-17 12:05:28.366:E/AndroidRuntime(17789):在java.lang.reflect.Method.invoke(Method.java :511) 04-17 12:05:28.366:E/AndroidRuntime(17789):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 04-17 12:05:28.366:E/AndroidRuntime(17789):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 04-17 12:05:28.366:E/AndroidRuntime 17789):at dalvik.system.NativeStart.main(Native Method)

+0

我的猜测是findfragmentbytag返回null,请在运行该方法之前尝试将您的片段赋值给变量,然后调试以查看片段是否为null,如果是的话,找出它为什么为null。 – ePeace

+0

奇怪。这个标签位于一个名为Constants的独立静态类中并被设置。但我会尝试你的建议。 – Seishin

+0

请发送异常的logcat。 – Egor

在调用updateGridView之前,建议检查CalendarFragment为null。您何时添加此片段尚不清楚。它可能还没有添加,或者已经被删除。

@Override 
public void onDataSetChange() { 

CalendarFragment fragment = ((CalendarFragment)getSupportFragmentManager().findFragmentByTag(Constants.FRAGMENT_CALENDAR_TAG)); 
if(fragment != null) fragment.updateGridView(); 
} 
+0

这是一个很好的观点,但我不认为这是事实。只是因为我有一个活动主机正在启动一个片段。从这个片段我开始另一个我做一些工作,并将其保存在本地数据库。在返回时,例如弹出最后一个片段,我回到堆栈中的前一个片段,例如我从活动主机开始的第一个片段。 :) – Seishin

+0

如果在代码和公共日志中添加“FragmentManager.enableDebugLogging(enabled)”,将会很有趣。 – akelix

+0

刚刚启用它(不知道这样的“东西”存在!:)),从日志中可以看到的一切都很好。 :) – Seishin

我找到的解决方案是不是标签来从片段经理的片段,但使用保存片段中的局部变量,并从那里调用该方法。

+0

我想我和你有同样的问题。当你说你通过访问“局部变量”中的片段来使你的代码工作时,你是什么意思?你可以发布你的代码来访问片段的局部变量中的片段及其方法吗?谢谢! – Natalie