我有一个带有导航抽屉活动的应用程序,它正在调用一些片段。
在其中一个中,我有一个Google Map集成,从SharedPreferences中检索,我会显示一些标记和内容。
在Activity上,我有一个AsyncTask,可以在单击操作栏按钮时更新数据。它将新数据带入SharedPreferences。
我很难找到一种方法再次调用FragmentMap中的paintmap()方法,该方法采用SharedPreferences数据并使用新标记绘制地图等等。
我尝试过没有结果的OnSharedPreferenceChangeListener。
还尝试使用findFragmentByTag获取实际片段,但我无法调用该方法。
那么,什么是告诉片段数据已更新并需要重绘地图的更好方法?
提前致谢。
编辑1:我尝试过的一些事情:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_map, container, false);
txtUpdateInfo = (TextView) view.findViewById(R.id.last_update_info);
initilizeMap(); // This one includes paintMap at the end. It creates the map.
Check this pastebin for more: http://pastebin.com/DPPB7FiK
SharedPreferences.OnSharedPreferenceChangeListener spChanged = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) {
paintMap();
}
};
return view;
}
还尝试在MainActivity AsyncTask的postExecute上检索片段:
FragmentManager fm = getFragmentManager();
Fragment f = fm.findFragmentByTag("MAP");
f.paintMap(); // This gives me error and I cannot compile
另外,在同一个地方:
FragmentMap f = new FragmentMap();
f.paintMap();
这最后一个编译,但给了我NullPointer片段上的所有内容......不能正常工作。
答案 0 :(得分:0)
此代码的问题......
FragmentManager fm = getFragmentManager();
Fragment f = fm.findFragmentByTag("MAP");
f.paintMap(); // This gives me error and I cannot compile
...您已将f声明为Fragment
且Android Fragment
类没有名为paintMap()
的方法。您需要将其声明为FragmentMap
并将findFragmentByTag
的返回值转换为以下内容...
FragmentManager fm = getFragmentManager();
FragmentMap f = (FragmentMap) fm.findFragmentByTag("MAP");
f.paintMap();
对f.paintMap()
的调用应该有效。
另外(供参考)以下内容永远不会有效......
FragmentMap f = new FragmentMap();
f.paintMap();
原因是像Activity
一样Fragment
有一个生命周期,这意味着它不会被完全初始化,直到它在FragmentTransaction
中使用并且已经通过其生命周期方法,如onAttach
,onCreateView
,onResume
等。