Android Studio中Kotlin编写的MainActivity无法创建启动求助
问题描述
在Android Studio中创建新Kotlin项目后,Kotlin编写的MainActivity无法正常启动:
- 运行后仅显示带ActionBar的空白界面
- onCreate方法中添加的日志未在Logcat输出,Logcat仅显示:
--------- beginning of crash --------- beginning of system --------- beginning of main
而Java编写的Activity运行完全正常,已添加所有必要依赖,执行过清理缓存并重建项目,问题仍存在。
相关配置代码
项目根目录build.gradle
plugins { id 'com.android.application' version '8.0.0' apply false id 'com.android.library' version '8.0.0' apply false id 'org.jetbrains.kotlin.android' version '1.8.21' apply false }
app模块build.gradle
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-android' } android { namespace 'com.example.driversupport' compileSdk 33 defaultConfig { applicationId "com.example.driversupport" minSdk 24 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } dependencies { implementation 'androidx.core:core-ktx:1.10.0' implementation "org.jetbrains.kotlin:kotlin-stdlib:1.8.21" implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.9.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' def nav_version = "2.5.3" // Java language implementation implementation "androidx.navigation:navigation-fragment:$nav_version" implementation "androidx.navigation:navigation-ui:$nav_version" // Kotlin implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" // Feature module Support implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version" // Testing Navigation androidTestImplementation "androidx.navigation:navigation-testing:$nav_version" // Jetpack Compose Integration implementation "androidx.navigation:navigation-compose:$nav_version" }
MainActivity.kt
package com.example.driversupport.presentation.ui.activity import android.os.Bundle import android.os.PersistableBundle import android.util.Log import android.widget.LinearLayout import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment import com.example.driversupport.R class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { setTheme(R.style.Theme_DriverSupport) super.onCreate(savedInstanceState, persistentState) setContentView(R.layout.fragment_devices) } }
Activity.java
package com.example.driversupport.presentation.ui.activity; import android.os.Bundle; import android.util.Log; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.example.driversupport.R; public class Activity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_devices); } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.DriverSupport" tools:targetApi="31"> <activity android:name=".presentation.ui.activity.MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
问题原因
Kotlin版MainActivity重写了错误的onCreate方法重载:
- AppCompatActivity默认启动时调用的是
onCreate(Bundle?)方法 - 你重写的是
onCreate(Bundle?, PersistableBundle?),这个方法仅在Activity配置了android:persistableMode属性(值为persistAcrossReboots或persistRootOnly)时才会被系统触发 - 由于你的Manifest中未配置该属性,系统会调用父类的无PersistableBundle参数的
onCreate方法,导致你的初始化逻辑(设置主题、加载布局)完全没执行,因此出现空白界面且日志无输出
解决方案
修改MainActivity.kt,将onCreate方法改为正确的重载版本:
package com.example.driversupport.presentation.ui.activity import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import com.example.driversupport.R class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { setTheme(R.style.Theme_DriverSupport) super.onCreate(savedInstanceState) setContentView(R.layout.fragment_devices) // 添加日志验证 Log.v("MainActivity", "onCreate executed") } }
修改后重新运行项目,即可看到布局正常加载,Logcat中也会输出对应的日志。
内容的提问来源于stack exchange,提问作者Tatiana Kogai
相关产品推荐
相关产品推荐

