问候我的开发人员朋友们!
我创建了一个演示应用程序来测试 minSdk 14 和 targetSdj 23 的材料设计。我在下面有以下文件。它在 21 API 以下工作正常。我相信罪魁祸首是 Styles-v21.xml因为该应用程序在此之前运行良好。
这是一个简单的设置,只有一个活动。我正在测试材料主题和 AppCompat 主题以处理以下方案。
- Theme.AppCompat for API 低于 21。
- Theme.Material for API 21 and 21+.
该应用程序在API 21以下运行良好,但在21+以上,应用程序崩溃说:"不幸的是,材料测试已停止。
错误如下:
FATAL EXCEPTION: main
Process: net.slidenerd.materialtest, PID: 28204
java.lang.RuntimeException: Unable to start activity ComponentInfo{net.slidenerd.materialtest/net.slidenerd.materialtest.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:340)
at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:309)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:273)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
at net.slidenerd.materialtest.MainActivity.onCreate(MainActivity.java:12)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
主活动.java
package net.slidenerd.materialtest;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
样式.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
样式-v21.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:colorPrimary">@color/colorPrimary</item>
<item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="android:colorAccent">@color/colorAccent</item>
</style>
</resources>
清单.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.slidenerd.materialtest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:theme="@style/AppTheme"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
解决方案:我通过扩展活动而不是 AppCompatActivity 解决了这个问题,并且应用程序在 API 14+ 到 API 23 上都能顺利运行。但是,您能否证明此问题的首选解决方案是合理的。
产生错误所需的所有代码都在上面。
注意:要产生错误,MainActivity 应扩展 AppCompatActivity,并且您应该在 API 21 或更高版本上运行。
谁能解释一下这里发生的理想案例,以便了解根本问题?
谢谢!
如果您的活动从AppCompatActivity
扩展是强制性的,则您的活动主题必须Theme.AppCompat theme (or descendant)
。
如果您想使用其他主题,请不要从AppCompatActivity
扩展,您将停止接收java.lang.IllegalStateException
。
希望这有帮助!!
AppCompatActivity 应该与 Compat 库中的其他组件一起使用,他们希望您在主题中定义了一些属性(如 android:colorPrimary、android:colorSecondary 等)。如果未在主题中定义这些属性,则需要它们的组件将引发运行时异常。Theme.AppCompat 主题定义了这些属性。
相反,没有问题。您可以从活动扩展并使用 Theme.AppCompat 的主题,而不会出现问题,但您将丢失 AppCompatActivity 提供的某些功能。
因此,如果要使用 AppCompatActivity,请使用 Theme.AppCompat 主题或在主题中定义所需的属性。您可以转到引发异常的行,以查看需要哪个属性。