35

我正在尝试学习 android,并按照有关如何使用 Google Maps API V.2 的说明进行操作,现在我可以使用它了。但是,在developers.google.com上找到的关于如何配置地图初始状态的说明建议在xml 文件中定义一个命名空间,在本例中为“map”。

下面的 xml 代码给出了错误“意外的命名空间前缀“映射” ”。尝试在片段标记内定义xmlns:map会产生相同的错误,但使用“xmlns”。

我显然在这里缺少一些基本的 xml 知识,有人可以帮助我吗?

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"        
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:map="http://schemas.android.com/apk/res-auto"      <!-- Definition -->
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment 
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment"
        map:cameraBearing="112.5"/>                            <!-- PROBLEM -->

</RelativeLayout>
4

9 回答 9

26

我也有这个问题。我做了项目/清理,错误消失了,现在工作正常。

于 2013-04-20T02:00:33.363 回答
20

你必须做两件事:

首先: https ://docs.google.com/document/pub?id=19nQzvKP-CVLd7_VrpwnHfl-AE9fjbJySowONZZtNHzw

将对 Google Play 服务的依赖项添加到您的项目中

Project -> Properties -> Android -> Library, Add -> google-play-services_lib

第二: https ://developers.google.com/maps/documentation/android/intro

选择Project > Properties,选择Java Build Path,然后导航到Libraries。选择Add External Jars,包含以下 jar 文件,然后单击确定:

<android-sdk-folder>/extras/android/compatibility/v4/android-support-v4.jar

现在我的项目不再显示错误:)

于 2013-04-10T10:54:58.787 回答
19

我今天也有同样的问题。我昨晚升级了SDK,之前没有看到这个问题。我也加载了 Android Map V2 示例演示项目,今天“multimap_demo.xml”文件显示“为标签片段找到意外的命名空间前缀“map””错误。我应用了建议的 xml 包含,它又可以工作了。会给它+1,但没有信誉。

更新:我忘记了这个问题,今天重新编写了我的代码并删除了包含。当然错误又回来了。我找到了这个并将其添加到片段节的布局中:

tools:ignore="MissingPrefix"

它似乎至少掩盖了这个问题。

更新:这个错误显然是由于 Android Lint Tool 中的错误而发生的。参考问题https://code.google.com/p/gmaps-api-issues/issues/detail?id=5002

于 2013-03-07T19:16:15.413 回答
13

还有另一种解决方法,可让您继续在布局文件中而不是在 Java 代码中设置所有内容。由于错误似乎只发生在布局文件SupportMapFragment中 a 的子元素ViewGroup时,因此可以将元素提取<fragment>到其自己的布局文件中,然后将其包含在所需的更大布局中。

例如,假设您正在尝试这样做:

my_awesome_layout.xml

...
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"        
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment 
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment"
        map:cameraBearing="112.5"/>

</RelativeLayout>

你可以像这样分解它:

include_map_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://scheams.android.com/apk/res-auto"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment"
    map:cameraBearing="112.5"/>

my_awesome_layout.xml

...
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"        
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include 
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        layout="@layout/include_map_fragment" />

</RelativeLayout>
于 2013-03-07T14:49:27.387 回答
4

好吧,我知道,这并不是名称空间问题的真正解决方案,也许这可能会有所帮助。

因为我不知道任何 XML 解决方案,所以我以编程方式完成了它:

mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
mMap.setTrafficEnabled(true);
setupMapView();

private void setupMapView(){
 UiSettings settings = mMap.getUiSettings();        
 mMap.animateCamera(CameraUpdateFactory.newCameraPosition(
  new CameraPosition(new LatLng(50.0, 10.5), 
  13.5f, 30f, 112.5f))); // zoom, tilt, bearing
 mMap.setTrafficEnabled(true);
 settings.setAllGesturesEnabled(true);
 settings.setCompassEnabled(true);
 settings.setMyLocationButtonEnabled(true);
 settings.setRotateGesturesEnabled(true);
 settings.setScrollGesturesEnabled(true);
 settings.setTiltGesturesEnabled(true);
 settings.setZoomControlsEnabled(true);
 settings.setZoomGesturesEnabled(true);
}

所以谷歌地图是默认初始化的,但之后直接从代码中获取参数。

于 2013-02-27T15:46:47.413 回答
3

我有完全相同的问题。提供的示例

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:map="http://schemas.android.com/apk/res-auto"
  android:id="@+id/map"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  class="com.google.android.gms.maps.SupportMapFragment"
  map:cameraBearing="112.5"
  map:cameraTargetLat="-33.796923"
  map:cameraTargetLng="150.922433"
  map:cameraTilt="30"
  map:cameraZoom="13"
  map:mapType="normal"
  map:uiCompass="false"
  map:uiRotateGestures="true"
  map:uiScrollGestures="false"
  map:uiTiltGestures="true"
  map:uiZoomControls="false"
  map:uiZoomGestures="true"/>

工作正常,但是如果您尝试将其添加到父元素中,它会拒绝接受 xmlns。如果将 xmlns 声明移动到顶部元素,它仍然拒绝接受片段中的映射前缀:

Unexpected namespace prefix "map" found for tag fragment

现在,如果您扩展 SupportMapFragment 并使用如下自定义视图:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp">

    <com.google.android.gms.maps.MapView
        android:id="@+id/map_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        map:cameraBearing="0" 
        map:cameraTargetLat="54.25"
        map:cameraTargetLng="-4.56"
        map:cameraTilt="30"
        map:cameraZoom="5.6"
        map:mapType="normal"
        map:uiCompass="true"
        map:uiRotateGestures="true"
        map:uiScrollGestures="true"
        map:uiTiltGestures="true"
        map:uiZoomControls="false"
        map:uiZoomGestures="true">

    </com.google.android.gms.maps.MapView>

</LinearLayout>

...然后它不会抱怨,并且生成的地图是正确的。对我来说,这引发了进一步的问题,但是由于没有像样的示例说明如何进行此子类化,您必须做的不仅仅是覆盖onCreateView,当我随后尝试对地图执行任何操作时,我得到以下信息:

java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.

...即使我在地图出现后等待 30 秒。(仅第一次加载)

于 2013-02-23T10:59:52.363 回答
1

我认为您不能使用<!-- Definition -->. 如果您删除它,问题仍然存在吗?

于 2013-02-22T22:42:19.690 回答
0

显然这只是一个误导性的 Lint 检查错误。当您在 Eclipse 的问题视图中右键单击有错误的行,选择快速修复选项并选择例如Ignore Check for project时,您可以将其删除。

错误消失,项目构建并且应用程序运行良好。

于 2014-03-03T18:00:16.170 回答
0

就我而言,这是一个很大的失误,我忘记在 gradle 文件中添加我的谷歌地图依赖项:

compile 'com.google.android.gms:play-services-maps:11.2.0'
于 2017-09-29T17:44:04.400 回答