当AsyncTask完成活动时调用片段方法

时间:2014-08-05 18:20:05

标签: java android google-maps android-fragments android-asynctask

我有一个带有导航抽屉活动的应用程序,它正在调用一些片段。

在其中一个中,我有一个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片段上的所有内容......不能正常工作。

1 个答案:

答案 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中使用并且已经通过其生命周期方法,如onAttachonCreateViewonResume等。