NoSuchFieldError:将MapFragment与Play Services 6.5一起使用时,没有静态字段MapAttrs类型

Phi*_* E. 34 android google-play-services google-maps-android-api-2 android-gradle-plugin

也许我在这里遗漏了一些东西,但我无法在Play Services 6.5中使用新的Maps依赖项

我得到以下异常:

java.lang.NoSuchFieldError: No static field MapAttrs of type 
    [I in class Lcom/google/android/gms/R$styleable; or its superclasses 
    (declaration of 'com.google.android.gms.R$styleable' appears in 
    /data/app/com.kaching.merchant.dev1-1/base.apk)
        at com.google.android.gms.maps.GoogleMapOptions
            .createFromAttributes(Unknown Source)
        at com.google.android.gms.maps.SupportMapFragment
            .onInflate(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

表现:

<meta-data android:name="com.google.android.gms.version"
  android:value="@integer/google_play_services_version" />

<meta-data
  android:name="com.google.android.maps.v2.API_KEY"
  android:value="my-awesome-key"/>


<uses-permission 
  android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
Run Code Online (Sandbox Code Playgroud)

Gradle文件:

compile 'com.google.android.gms:play-services-maps:6.5.+'
compile 'com.android.support:support-v4:21.0.2'
Run Code Online (Sandbox Code Playgroud)

布局:

<fragment
   android:id="@+id/map"
   android:name="com.google.android.gms.maps.MapFragment"
   android:layout_width="match_parent"
   android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud)

这是坏了还是我做错了什么?

完整的捆绑推动了我超过dex限制,我宁愿不使用multidex

Pau*_*ulR 17

通过SDK Manager 将Google Repository更新为版本15可以解决问题并消除变通方法的需求.项目清理是必需的.

Android SDK

问题7432中也提到了这一点.


小智 5

临时解决方案

用FrameLayout容器替换xml映射片段

<FrameLayout
    android:id="@+id/map_container"
android:layout_weight="2"
android:layout_width="match_parent"
android:layout_height="0dp"
/>
<!--<fragment android:id="@+id/map"-->
<!--android:layout_weight="2"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="0dp"-->
<!--android:name="com.google.android.gms.maps.SupportMapFragment"/>-->
Run Code Online (Sandbox Code Playgroud)

在代码中创建片段并替换容器

SupportMapFragment supportMapFragment = SupportMapFragment.newInstance();
getSupportFragmentManager().beginTransaction().replace(R.id.map_container,supportMapFragment).commit();

//this you should do anyway
supportMapFragment.getMapAsync(new OnMapReadyCallback() {
    @Override
    public void onMapReady(GoogleMap googleMap) {
        //setup map - optional
        UiSettings settings = googleMap.getUiSettings();
        settings.setCompassEnabled(false);
        settings.setZoomControlsEnabled(false);
        settings.setAllGesturesEnabled(true);
        settings.setMyLocationButtonEnabled(true);
    }
});
Run Code Online (Sandbox Code Playgroud)

请注意,上面的内容是在没有任何其他片段的活动中的'onCreate'中完成的,因此请确保您根据生命周期和逻辑调整事务.