点击offersButton跳转SecondActivity时模拟器崩溃的排查与修复
Activity跳转崩溃:You need to use a Theme.AppCompat theme (or descendant) 解决方法
问题描述
点击MainActivity中的offersButton尝试跳转到SecondActivity时,模拟器直接崩溃无法进入目标页面。尝试冷启动模拟器、更换Pixel 4a和Pixel 7设备均未解决问题,查看Logcat后定位到错误原因。
错误日志
FATAL EXCEPTION: main Process: com.example.myapplication, PID: 7625 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.SecondActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8177) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:926) at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:889) at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:772) at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:197) at com.example.myapplication.SecondActivity.onCreate(SecondActivity.kt:9) at android.app.Activity.performCreate(Activity.java:8595) at android.app.Activity.performCreate(Activity.java:8573) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1456) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3764) ... 11 more
原因分析
SecondActivity继承了AppCompatActivity,而AppCompat组件要求Activity必须使用Theme.AppCompat或其子主题,否则会触发上述IllegalStateException。
修复方案
在AndroidManifest.xml中为SecondActivity添加主题配置:
<activity android:name=".SecondActivity" android:exported="false" android:theme="@style/Theme.AppCompat"/>
如果希望整个应用都使用AppCompat主题,也可以直接在<application>标签中设置,避免给每个Activity单独配置:
<application ... android:theme="@style/Theme.AppCompat">
完整代码示例
MainActivity.kt
package com.example.myapplication import android.content.Intent import android.os.Bundle import android.view.View.INVISIBLE import android.view.View.VISIBLE import android.widget.Button import android.widget.EditText import android.widget.TextView import android.widget.Toast import androidx.activity.ComponentActivity class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val greetingTextView = findViewById<TextView>(R.id.tvHello) val inputField = findViewById<EditText>(R.id.etName) val submitButton = findViewById<Button>(R.id.btnSubmit) val offersButton = findViewById<Button>(R.id.btnOffers) var enteredName = "" submitButton.setOnClickListener { enteredName = inputField.text.toString() if(enteredName == "") { offersButton.visibility = INVISIBLE greetingTextView.text = "" Toast.makeText( this@MainActivity, "Please, enter your name!", Toast.LENGTH_SHORT ).show() }else{ val message = "Welcome $enteredName" greetingTextView.text = message inputField.text.clear() offersButton.visibility = VISIBLE } } offersButton.setOnClickListener { val intent = Intent(this,SecondActivity::class.java) intent.putExtra("USER",enteredName) startActivity(intent) } } }
SecondActivity.kt
package com.example.myapplication import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.TextView class SecondActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_second) val userName = intent.getStringExtra("USER") val textView = findViewById<TextView>(R.id.tvOffer) val message = "$userName, you will get free access" textView.text = message } }
activity_main.xml
<?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"> <TextView android:id="@+id/tvHello" android:layout_width="368dp" android:layout_height="97dp" android:text="@string/hello_message" android:textAlignment="center" android:textColor="#009688" android:textSize="34sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.21" /> <EditText android:id="@+id/etName" android:layout_width="286dp" android:layout_height="88dp" android:ems="10" android:hint="Type your name here" android:inputType="text" android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.496" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.391" /> <Button android:id="@+id/btnSubmit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="#000000" android:text="Submit" android:textColor="#FFFFFF" android:textSize="24sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.592" /> <Button android:id="@+id/btnOffers" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="View Offers" android:textSize="24sp" android:visibility="invisible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.789" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.901" /> </androidx.constraintlayout.widget.ConstraintLayout>
activity_second.xml
<?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" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" tools:context=".SecondActivity"> <TextView android:id="@+id/tvOffer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.252" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.168" /> </androidx.constraintlayout.widget.ConstraintLayout>
内容的提问来源于stack exchange,提问作者Rajith R
相关产品推荐
相关产品推荐

