如何在旧设备上使用Theme.Material启动应用程序

Dav*_*ini 15 android material-design android-5.0-lollipop

如何在pre-v21设备上运行我的应用程序?

compileSdkVersion  'android-L'
minSdkVersion 14
targetSdkVersion 'L'
Run Code Online (Sandbox Code Playgroud)

我只使用Theme.Materialon v21.我没有使用v20支持库,我正在使用com.android.support:support-v4:19.+

从Android Studio运行应用程序时,它表示该设备不兼容:

{compatible=NO, reason=minSdk(API 20, L preview) != deviceSdk(API 16)}
Run Code Online (Sandbox Code Playgroud)

从哪里开始minSdk 20?

编辑:

发生这种情况的原因可能是(如果经过验证)

如果您针对预览SDK(android-L)进行编译,则构建工具会将minSdkVersion和targetSdkVersion锁定到相同的API级别.这导致生成的应用程序无法安装在运行旧版Android的设备上,即使您的应用程序没有执行任何特定于L的操作.

资料来源:Reddit

Ego*_*uba 20

如果您针对预览SDK(android-L)进行编译,则构建工具将锁定minSdkVersion并targetSdkVersion达到相同的API级别.这导致生成的应用程序无法安装在运行旧版Android的设备上,即使您的应用程序没有执行任何特定于L的操作.

Android Gradle Plugin版本0.11默认启用了新的Manifest Merger,它允许我们做一些漂亮的东西.因此,您必须在AndroidManifest.xml文件中添加一个仅指定tools:node属性的uses-sdk节点.
此特定配置告诉清单处理器uses-sdk使用具有该属性的uses-sdk节点中的tools:node="replace"属性替换低优先级清单(例如库清单)中的节点的任何属性.由于Gradle还插入minSdkVersion并targetSdkVersion从您build.gradle进入此uses-sdk节点,因此您需要添加所有内容.

所以你的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"
    package="net.eringle.android.ldemo">

    <uses-sdk
        tools:node="replace" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

现在,您应该可以在minSdkVersion支持的任何设备上运行您的应用程序,同时利用支持库中的简洁新视图和实用程序!


接下来,我稍微修改了Android L平台,以隐藏它实际上是构建工具的预览平台这一事实.您可以从这两个镜像中的任何一个下载它: 镜像#1,镜像#2.

将存档解压缩到安装了Android SDK的平台目录中.您会注意到我已将其命名android-21并设置API级别21.而不是引用L或android-L在您的build.gradle,只需使用21:

android {
    compileSdkVersion 21
    buildToolsVersion '20.0.0'
    defaultConfig {
        applicationId 'net.eringle.android.ldemo'
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName '1.0'
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,当您构建并尝试运行应用程序时,您应该能够将其发送到较旧的平台设备而不会出现任何问题.玩得很开心,同时保持向后兼容性!


显然,上面提供的解决方法充其量只是黑客攻击.请注意这个问题,因为它似乎最接近问题的核心(如果Android团队甚至认为它是一个问题).

所有的学分都归EddieRingle所有

  • 我还应该注意,使用android-21作为'Compile Sdk Version'不会改变状态栏颜色,尽管android:colorPrimaryDark是在材质主题中定义的.要查看此功能的实际应用,您应该使用L设备(或模拟器)并将sdk设置为android-L (2认同)