我正在编写一个Android应用程序,目标是4.0及以上,我使用谷歌地图v2。我想用Fragment
来设置InfoWindow
的内容。有人知道这是否可能吗?
我的类实现了InfoWindowAdapter
,这里是相关的代码:
//
// InfoWindowAdapter interface
//
@Override
public View getInfoContents (Marker marker) {
LinearLayout layout = new LinearLayout(this.getActivity());
LayoutInflater inflater = (LayoutInflater) this.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.map_details, layout);
MapDetailsFragment frag = new MapDetailsFragment();
// TODO: How to add this fragment to v???
return v;
}
@Override
public View getInfoWindow (Marker marker) {
return null;
}
我在实例化frag
后尝试了以下代码:
this.getFragmentManager().beginTransaction().replace(R.id.fragment_map_details, frag).commit();
但是R.id.fragment_map_details
来自R.layout.map_details
,因此FragmentManager
还不知道它的任何事情。
任何指示将非常感激!
从适配器返回的视图不是实时视图,而是转换为位图,因此不会执行与此视图相关的代码(如按钮单击)。
同样的情况将是片段,所以你可以停止尝试,而不是创建一个绑定在一起的map_details和片段布局布局。在xml中使用include可能会工作。
我还没有见过任何人做到这一点,我认为这是不可能的,因为这是一个为你创建的简单视图,这意味着很多事情都发生在你的背后。
三个建议:
-
事务和提交是异步的。你可以试着拨打http://developer.android.com/reference/android/app/FragmentManager.html#executePendingTransactions()。然而,当我试图使用它时,我有一次遇到了异常。但你可能会更幸运。
-
否则,您可以尝试将片段添加为常规子视图,通过替换
R.id.fragment_map_details
从frag.getView()
返回的视图到您的容器。然而,这只是一个大胆的猜测。也许你不应该以这种方式使用那个返回值。(我对Android的API有点谨慎…) -
从https://developers.google.com/maps/documentation/android/infowindows(在"自定义信息窗口"下):
要稍后更新信息窗口(例如,在图像加载后),调用showInfoWindow()。
所以,如果你能找到一种方法得到通知时,片段事务完成,然后你可以调用该方法来更新信息窗口