如何在使用Theme.Material主题时使用ActionBarActivity

24

我创建了一个针对L预览版本的新项目。SDK生成的启动活动扩展了ActionBarActivity,但是当我尝试运行生成的基本活动时,它会抛出以下异常:

  Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
            at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:110)
            at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:57)
            at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:99)

我搜索了一下,但好像不存在Theme.AppCompat.Material。如何让ActionBarActivity利用新的材料主题?

我的build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 'android-L'
    buildToolsVersion '20.0.0'
    defaultConfig {
        applicationId 'com.sdchang.example'
        minSdkVersion 'L'
        targetSdkVersion 'L'
        versionCode 1
        versionName '1.0'
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.+'
    compile 'com.mcxiaoke.volley:library:1.0.+@aar'
    compile 'com.google.code.gson:gson:2.2.+'
    compile 'com.squareup.okhttp:okhttp:2.0.+'
}

3
21+的Theme.AppCompat继承自Theme.Base.AppCompat,后者又继承自Theme.Platform.AppCompat,再接着是在21+的设备上(即Android L及以上版本)继承自android:Theme.Material主题。 - ianhanniballake
非常感谢,这解决了我的问题。你能创建一个清晰的答案吗? - Some Noob Student
3个回答

54

AppCompat v21.+'s Theme.AppCompat继承自Theme.Base.AppCompat,后者继承自Theme.Platform.AppCompat,再次继承自21+设备上(即Android L)的android:Theme.Material主题,因此如果您正在使用AppCompat,则无需执行任何特定操作即可获得Material主题。


2
提醒一下,SDK生成的res/values-v21中的styles.xml使用了@android:Theme.Material.Light。你可能需要在这方面提交一个工单。 - Some Noob Student
1
我也遇到了完全相同的问题,现在我将尝试您提出的答案。但是我想指出,谷歌的文档 https://developer.android.com/preview/material/compatibility.html 明确表示我们应该在 values-21 文件夹中有一个单独的父级主题... - Rad Haring
确认:只需使用AppCompat主题,在v21上您将得到Material界面。我正在使用Theme.AppCompat.Light.DarkActionBar,并将其跟踪父级 Theme.Material.Light.DarkActionBar 用于v21+。但是在模拟器中,我的操作栏实际上并不是暗色的,但这毕竟是预览版。父级结构很正确,这个答案也是正确的。 - Rad Haring
2
尽管SDK按照文档正确操作,但我个人认为当SDK生成一个在运行时崩溃的项目时,这是一个bug。:( - Some Noob Student
为了澄清,谷歌已经意识到这是一个错误,并且修复程序正在等待下一个版本的批准。https://android-review.googlesource.com/#/c/112723/ - James Lockhart

3

您需要在构建gradle中更改依赖项为

compile 'com.android.support:appcompat-v7:21.+'

很遗憾,这不是它。21.+已经是SDK默认生成的版本。 - Some Noob Student
你的compileSdkVersion是'android-L'吗?能否提供你的gradle.build文件? - Vova K.
你能否尝试使用“android-L”而不是“L”? - Vova K.

-1
请使用以下主题:
android:theme="@style/Base.V7.Theme.AppCompat" >

必须使用android:theme="@style/stylename",并将appcompat_v7库链接到项目中。在styles.xml中,父级必须是parent="@style/Theme.AppCompat.Light.DarkActionBar"或您选择的其他主题。 - Lochana Ragupathy
这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言 - 您始终可以在自己的帖子上发表评论,并且一旦您拥有足够的声望,您将能够评论任何帖子 - The Holy Coder
1
@ManishDubey 确实看起来像是一个答案。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接