谷歌地图Android API-带片段的自定义信息窗口 编辑:这个问题的要点是:如何在安卓系统中放大谷歌地图信息窗口中的一个片段。我的尝试见下文。谢谢

谷歌地图Android API-带片段的自定义信息窗口 编辑:这个问题的要点是:如何在安卓系统中放大谷歌地图信息窗口中的一个片段。我的尝试见下文。谢谢,android,google-maps,android-fragments,infowindow,layout-inflater,Android,Google Maps,Android Fragments,Infowindow,Layout Inflater,我在我的应用程序中的一个片段上有一个谷歌地图,我可以在点击屏幕的地方得到一个子片段充气,但我需要子片段保持在原始的触摸位置,所以我决定尝试使用一个信息窗口,在触摸点创建一个标记并自动打开一个信息窗口 但是,我在将片段附加到InfoWindow时遇到了问题。以下是我到目前为止的情况: private View fragmentLayout; private RelativeLayout fragmentMapLayout; private MapView mv; p

我在我的应用程序中的一个片段上有一个谷歌地图,我可以在点击屏幕的地方得到一个子片段充气,但我需要子片段保持在原始的触摸位置,所以我决定尝试使用一个信息窗口,在触摸点创建一个标记并自动打开一个信息窗口

但是,我在将片段附加到InfoWindow时遇到了问题。以下是我到目前为止的情况:

    private View fragmentLayout;
    private RelativeLayout fragmentMapLayout;
    private MapView mv;
    private GoogleMap gm;
    private RelativeLayout fragmentContainer;
    private FrameLayout fragmentContainerLayout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        fragmentLayout = inflater.inflate(R.layout.fragment_map, container, false);
        fragmentMapLayout = (RelativeLayout) fragmentLayout.findViewById(R.id.map_fragment_layout);

        mv = (MapView) fragmentLayout.findViewById(R.id.mapview);
        mv.onCreate(savedInstanceState);

        mv.getMapAsync(this);

        return fragmentLayout;
    }

    @Override
    public void onMapReady(GoogleMap map) {
        gm = map;
        gm.setMyLocationEnabled(true);

        gm.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng point) {
                float pX = (float) point.latitude;
                float pY = (float) point.longitude;

                gm.addMarker(new MarkerOptions()
                    .position(new LatLng(pX, pY))
                    .alpha(0.0f)
                    .icon(BitmapDescriptorFactory.fromResource(R.mipmap.t_box01))
                    .title("title")).showInfoWindow();

            }
        });
        gm.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }
            @Override
            public View getInfoContents(Marker marker) {
                infoWindowLayout = getActivity().getLayoutInflater().inflate(R.layout.fragment_container, null);
                fragmentContainerLayout = (FrameLayout) infoWindowLayout.findViewById(R.id.fragment_container);

                    FragmentTransaction transaction = getFragmentManager().beginTransaction();
                    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                    transaction.add(fragmentContainerLayout.getId(), new FragmentTwo(), "fragment_id");
                    transaction.commit();

                return fragmentContainerLayout;
            }
        });
    }
XML fragment_container.XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:orientation="vertical"
    android:layout_width="100dp"
    android:layout_height="100dp">

</FrameLayout>
当试图将FragmentTwo直接插入到主片段中时,这种膨胀FragmentTwo的方法同样有效,但当试图将其插入到InfoWindow中时,情况有所不同


我不确定它为什么找不到已存在于xml中的视图的ID。

请确保在
setContentView()
中指定了正确的布局。传递到
FragmentTransaction.add()
中的ID在您的情况下
R.ID.fragment\u容器
必须是
setContentView()中指定的布局的子级

一个可能的问题是使用
getFragmentManager()
,调用片段时尝试使用
getChildFragmentManager

这里有一个有用的片段链接:

请参见

从适配器返回的视图不是活动视图,而是已转换的视图 转换为位图,因此没有与此视图关联的代码(如按钮 单击)将永远执行

同样的情况也适用于片段,因此您可以停止尝试,然后 而是创建一个将地图细节和片段绑定在一起的布局 布局。在xml中使用include可能会起作用


多亏了你的回答,我想我现在明白这个问题了。基本上,我需要添加的视图是为父活动(在本例中为片段)膨胀的视图的子视图,但这里的问题是,由于我试图将此子片段添加到InfoWindow,因此我需要将视图动态添加到InfoWindow,而不是保存实际地图的父视图。这有意义吗?如何将新视图添加到包含地图的父视图中,但不将其锁定到父视图中?我需要它是独立的,并由getInfoContents()方法返回。。。
E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: com.example.exampleapp, PID: 18936
                                                                   java.lang.IllegalArgumentException: No view found for id 0x7f0f00d1 (com.example.exampleapp:id/fragment_container) for fragment FragmentTwo{2ad9a637 #5 id=0x7f0f00d1 fragment_id}
                                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1059)
                                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
                                                                       at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
                                                                       at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
                                                                       at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
                                                                       at android.os.Handler.handleCallback(Handler.java:739)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:135)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5343)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at java.lang.reflect.Method.invoke(Method.java:372)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)