【问题标题】:Google Maps API V2 in listview row列表视图行中的 Google Maps API V2
【发布时间】:2014-03-27 12:06:56
【问题描述】:

我有一个ListView,它的每一行都应该包含一个地图。如果我尝试显示FragmentActivity 的地图,它会完美运行。但我的主要目标是在ListView 的每一行上显示一张地图。我正在将代码移动到我的适配器并更改布局,但它不起作用。

这是我的代码: 我的适配器:

public View getView(int position, View view, ViewGroup parent) {
        ViewHolder holder = null;
        if(view ==null){
            ...
            view = holder.layout;
        }

        ..
        GoogleMap map = ((SupportMapFragment) StreamActivity.streamFragmentManager.findFragmentById(R.id.mapevidence)).getMap();
        map.setMapType(GoogleMap.MAP_TYPE_NORMAL);

        double latitude = 17.385044;
        double longitude = 78.486671;
        MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps");
        marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));
        map.addMarker(marker);
        float cameraZoom = 18;
        map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), cameraZoom));

        return view;
    }

ListView每一行我的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
        <fragment 
        android:id="@+id/mapevidence"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        class="com.google.android.gms.maps.SupportMapFragment" />
 </RelativeLayout>

LogCat:

03-27 14:05:14.138: E/AndroidRuntime(25049): FATAL EXCEPTION: main
03-27 14:05:14.138: E/AndroidRuntime(25049): android.view.InflateException: Binary XML file line #22: Error inflating class fragment
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at com.example.StreamAdapter.getView(StreamAdapter.java:59)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.AbsListView.obtainView(AbsListView.java:2207)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.ListView.makeAndAddView(ListView.java:1860)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.ListView.fillDown(ListView.java:687)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.ListView.fillFromTop(ListView.java:748)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.ListView.layoutChildren(ListView.java:1676)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.AbsListView.onLayout(AbsListView.java:2037)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.View.layout(View.java:14099)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.ViewGroup.layout(ViewGroup.java:4464)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1670)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1528)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1441)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.View.layout(View.java:14099)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.ViewGroup.layout(ViewGroup.java:4464)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.View.layout(View.java:14099)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.ViewGroup.layout(ViewGroup.java:4464)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1670)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1528)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1441)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.View.layout(View.java:14099)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.ViewGroup.layout(ViewGroup.java:4464)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.View.layout(View.java:14099)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.ViewGroup.layout(ViewGroup.java:4464)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2183)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1947)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4879)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.Choreographer.doCallbacks(Choreographer.java:579)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.Choreographer.doFrame(Choreographer.java:548)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.os.Handler.handleCallback(Handler.java:725)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.os.Looper.loop(Looper.java:153)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.app.ActivityThread.main(ActivityThread.java:5336)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at java.lang.reflect.Method.invokeNative(Native Method)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at java.lang.reflect.Method.invoke(Method.java:511)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at dalvik.system.NativeStart.main(Native Method)
03-27 14:05:14.138: E/AndroidRuntime(25049): Caused by: java.lang.IllegalArgumentException: Binary XML file line #22: Duplicate id 0x7f050037, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:296)
03-27 14:05:14.138: E/AndroidRuntime(25049):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
03-27 14:05:14.138: E/AndroidRuntime(25049):    ... 46 more

xml 上的 Line22 是片段的开头。

【问题讨论】:

  • “我有一个 ListView 并且它的每一行都应该包含一个地图”——这不太可能正常工作,除非您将 static maps 用作普通图像。
  • @CommonsWare 谢谢。它解决了我的问题。

标签: android listview android-fragments google-maps-android-api-2


【解决方案1】:

你应该使用 MapView 而不是 MapFragment

https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/MapView

在你的 xml 中使用它:

 <com.google.android.gms.maps.MapView android:id="@+id/mapevidence"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" />

在您的代码中,您应该将视图事件传递给地图视图,片段会自动执行此操作,但使用视图您应该添加更多代码:

MapView mapView;
GoogleMap map;
...
mapView = (MapView) v.findViewById(R.id.mapevidence);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(this);
....
@Override
public void onMapReady(GoogleMap googleMap)
{
    map = googleMap;
    try {
            MapsInitializer.initialize(NewsDetail.this);
        }
    catch (Exception e) 
       {
            ...
        }
....
@Override
public void onResume() {
    mapView.onResume();
    super.onResume();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}

【讨论】:

    【解决方案2】:

    使用静态地图 API 而不是地图片段。您可以使用 Web 视图来实现它。首先用 webview 替换地图片段。请按照以下步骤操作。

    在asset文件夹的html文件夹中创建一个html文件static_map.html

    它的内容可能如下所示

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Untitled Document</title>
    <style>
        html,body{
            padding:0;
            margin:0;
        }
        .map{
            position: fixed;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        width: 100%;
        height: 100%;
        }
    </style>
    </head>
    
    <body>
    <img class="map" src="REPLACE_HERE" >
    </body>
    </html>
    

    以编程方式创建一个静态地图 URL 并用它替换 REPLACE_HERE 字符串。将其加载到 Web 视图中。这将大大减少我们的工作量。

    代码如下

    try {
        String url ="https://maps.googleapis.com/maps/api/staticmap?";
        url+="&zoom=13";
        url+="&size=600x300";
        url+="&maptype=roadmap";
        url+="&markers=color:green%7Clabel:G%7C"+latitude+", "+longitude;
        url+="&key="+ YOUR_GOOGLE_API_KEY;
    
        InputStream is = context.getAssets().open("html/static_map.html");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        String str = new String(buffer);
        str = str.replace("REPLACE_HERE", url);
        wv_map.getSettings().setJavaScriptEnabled(true);
        wv_map.loadDataWithBaseURL("", str, "text/html", "UTF-8", "");
    } catch (IOException e) {
    
    }
    

    需要为此在谷歌控制台中启用静态 API。

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2013-03-24
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多