【问题标题】:Google Maps Android API - Custom InfoWindow with FragmentGoogle Maps Android API - 带有片段的自定义信息窗口
【发布时间】:2016-04-25 18:33:27
【问题描述】:

编辑: 这个问题的要点是:如何在 Android 的 Google Maps InfoWindow 中为 Fragment 充气。请参阅下面的我的尝试。谢谢!


我的应用程序中有一个片段上的谷歌地图,我能够在我点击屏幕的地方获得一个子片段来膨胀,但我需要子片段保持在原始触摸位置,所以我决定尝试通过在触摸点创建标记并自动打开 InfoWindow 来使用 InfoWindow。

但是,我在将 Fragment 附加到 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 片段容器.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>

显然,也缺少一些无关代码,但这是与此问题相关的代码。我收到此错误:

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)

这种膨胀 FragmentTwo 的方法在尝试将其直接插入主 Fragment 时有效,但在尝试将其插入 InfoWindow 时有所不同。

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

【问题讨论】:

    标签: android google-maps android-fragments infowindow layout-inflater


    【解决方案1】:

    Add Android Fragment to InfoWindow Contents

    从适配器返回的视图不是实时视图,而是经过转换的 进入位图,因此没有与此视图关联的代码(如按钮 clicks) 将永远执行。

    片段也是如此,因此您可以停止尝试 而是创建一个将 map_details 和 fragment 绑定在一起的布局 布局。在 xml 中使用 include 可能会起作用。

    【讨论】:

      【解决方案2】:

      确保您在setContentView() 中指定了正确的布局。在您的情况下,R.id.fragment_container 传递到 FragmentTransaction.add() 的 ID 必须是 setContentView() 中指定的布局的子级。

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

      这里有一个有用的 Fragment 链接:https://developer.android.com/reference/android/app/Fragment.html#onActivityCreated(android.os.Bundle)

      【讨论】:

      • 我想我现在明白了这个问题,感谢您的回答。基本上,我需要添加的视图是为我的父 Activity(在这种情况下为片段)膨胀的视图的子视图,但这里的问题是,由于我试图将此子片段添加到 InfoWindow,我需要视图动态添加到信息窗口,而不是包含实际地图的父视图。那有意义吗?如何将新视图添加到持有地图的父视图,但不将其锁定到父视图中?我需要它是独立的并由 getInfoContents() 方法返回...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多