You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android新手无法添加特定组件至activity_main.xml,存在依赖冲突

解决Android组件添加及依赖冲突问题

嘿,作为Android新手遇到这些依赖和组件添加问题太正常了,我来一步步帮你捋顺搞定:

一、先解决核心的依赖版本冲突问题

你碰到的com.google.android.material:material:1.0.0与androidx.appcompat:appcompat:1.0.0兼容问题、以及Mockito版本冲突,是导致无法添加MapView的主要原因。先把这些依赖问题修复:

修改Module级别的build.gradle

统一升级AndroidX依赖到稳定同系列版本,同时处理Mockito的版本冲突:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 33 // 建议升级到较新稳定版,兼容更多库
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 25
        targetSdkVersion 33
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        // 配置Maps API密钥占位符,后续需要替换成你在Google Cloud申请的密钥
        manifestPlaceholders = [
                MAPS_API_KEY: "你的Google Maps API密钥"
        ]
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    // 开启Java 8兼容,适配新库特性
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    
    // 统一升级AndroidX依赖到稳定版本,解决兼容问题
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'com.google.android.material:material:1.9.0'
    
    // 添加Google Maps官方依赖
    implementation 'com.google.android.gms:play-services-maps:18.1.0'
    
    testImplementation 'junit:junit:4.13.2'
    // 解决Mockito版本冲突:排除传递依赖的旧版本,指定统一的新版本
    androidTestImplementation ('androidx.test:runner:1.5.2') {
        exclude group: 'org.mockito', module: 'mockito-core'
    }
    androidTestImplementation ('androidx.test.espresso:espresso-core:3.5.1') {
        exclude group: 'org.mockito', module: 'mockito-core'
    }
    androidTestImplementation 'org.mockito:mockito-core:4.11.0'
}

二、添加Google MapView到布局

依赖修复后,就可以在activity_main.xml中添加MapView了,注意配置正确的命名空间:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- 添加Google MapView -->
    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

还要在AndroidManifest.xml中添加Maps所需的权限和配置:

<manifest ...>
    <!-- Maps必需权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <application ...>
        <!-- 配置Maps API密钥,对应build.gradle中的占位符 -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="${MAPS_API_KEY}" />
        <!-- MapView依赖的服务声明 -->
        <service
            android:name="com.google.android.gms.maps.MapService"
            android:enabled="true"
            android:exported="false" />
    </application>
</manifest>

最后在MainActivity.kt中处理MapView的生命周期,避免崩溃:

class MainActivity : AppCompatActivity() {
    private lateinit var mapView: MapView
    private val MAP_VIEW_BUNDLE_KEY = "MapViewBundleKey"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mapView = findViewById(R.id.mapView)
        var mapViewBundle: Bundle? = null
        if (savedInstanceState != null) {
            mapViewBundle = savedInstanceState.getBundle(MAP_VIEW_BUNDLE_KEY)
        }
        mapView.onCreate(mapViewBundle)
        // 初始化地图
        mapView.getMapAsync { googleMap ->
            val sydney = LatLng(-34.0, 151.0)
            googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
            googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
        }
    }

    // 必须重写这些生命周期方法,保证MapView正常工作
    override fun onResume() {
        super.onResume()
        mapView.onResume()
    }

    override fun onStart() {
        super.onStart()
        mapView.onStart()
    }

    override fun onStop() {
        super.onStop()
        mapView.onStop()
    }

    override fun onPause() {
        mapView.onPause()
        super.onPause()
    }

    override fun onDestroy() {
        mapView.onDestroy()
        super.onDestroy()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        var mapViewBundle = outState.getBundle(MAP_VIEW_BUNDLE_KEY)
        if (mapViewBundle == null) {
            mapViewBundle = Bundle()
            outState.putBundle(MAP_VIEW_BUNDLE_KEY, mapViewBundle)
        }
        mapView.onSaveInstanceState(mapViewBundle)
    }

    override fun onLowMemory() {
        super.onLowMemory()
        mapView.onLowMemory()
    }
}

三、添加NestedScrollView和CardView

这两个组件属于AndroidX/Material库,依赖升级后直接在布局中添加即可,给你个嵌套示例:

<!-- 在MapView下方添加NestedScrollView和CardView -->
<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintTop_toBottomOf="@id/mapView"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent">

    <com.google.android.material.card.MaterialCardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        app:cardElevation="4dp">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="16dp"
            android:text="这是CardView内的内容,外层包裹了NestedScrollView" />

    </com.google.android.material.card.MaterialCardView>

</androidx.core.widget.NestedScrollView>

关键提醒

  • 记得去Google Cloud Console申请并启用Maps SDK for Android,替换build.gradle中的API密钥占位符
  • 升级compileSdkVersion到33是为了适配最新依赖,如果你暂时不想升级,也可以保持28,但建议逐步过渡到新版本
  • Mockito冲突是测试依赖传递导致的,通过排除旧版本+指定统一版本就能解决

内容的提问来源于stack exchange,提问作者Johnny Bravo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:33:32