Android Studio 项目适用于 Lollipop,但不适用于 Kitkat
Posted
技术标签:
【中文标题】Android Studio 项目适用于 Lollipop,但不适用于 Kitkat【英文标题】:Android Studio project works on Lollipop but does not work on Kitkat 【发布时间】:2016-01-24 11:19:22 【问题描述】:我有一个 android Studio 项目,该项目在具有 Android 构建版本 Lollipop 的设备上运行良好,但在尝试在具有 Android 构建版本 Kitkat 的设备上运行它时抛出异常。这是我项目的 build.gradle 文件:
android
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig
minSdkVersion 16
targetSdkVersion 21
versionCode 1
versionName "1.0"
multiDexEnabled true
renderscriptTargetApi 22
renderscriptSupportModeEnabled true
dependencies
compile fileTree(dir: 'libs', include: ['*.jar'])
compile files('libs/org.apache.commons.io.jar')
compile files('libs/commons-codec-1.10.jar')
compile('com.twitter.sdk.android:twitter:1.6.0@aar')
transitive = true;
compile files('libs/pinit-sdk-1.0.jar')
compile project(':bounceScroller')
compile 'com.ogaclejapan.smarttablayout:library:1.2.1@aar'
compile 'com.facebook.android:facebook-android-sdk:4.1.0'
compile 'com.android.support:appcompat-v7:21.2.0'
compile 'com.github.navasmdc:MaterialDesign:1.5@aar'
compile 'com.nineoldandroids:library:2.4.+'
compile 'com.esri.arcgis.android:arcgis-android:10.2.6-2'
compile 'com.github.clans:fab:1.5.3'
compile 'com.github.pedrovgs:draggablepanel:1.8'
compile 'com.android.support:support-v4:21.2.0'
compile 'com.ogaclejapan.smarttablayout:utils-v4:1.2.1@aar'
compile 'com.github.bumptech.glide:glide:3.6.0'
compile project(':rangeseekbar')
compile 'com.android.support:recyclerview-v7:22.2.0'
compile 'com.android.support:cardview-v7:22.2.0'
compile project(':blurry')
compile 'com.google.android.gms:play-services:7.8.0'
这是我在 Kitkat 设备上运行应用程序时遇到的错误:
java.lang.RuntimeException: Unable to start activity: android.view.InflateException: Binary XML file line #14: Error inflating class android.support.v4.view.ViewPager
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
at android.app.ActivityThread.access$900(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #14: Error inflating class android.support.v4.view.ViewPager
at android.view.LayoutInflater.createView(LayoutInflater.java:626)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:359)
at android.app.Activity.setContentView(Activity.java:2010)
at android.visitabudhabi.com.vad.Walkthrough.onCreate(Walkthrough.java:32)
at android.app.Activity.performCreate(Activity.java:5426)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
at android.app.ActivityThread.access$900(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:600)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:359)
at android.app.Activity.setContentView(Activity.java:2010)
at android.visitabudhabi.com.vad.Walkthrough.onCreate(Walkthrough.java:32)
at android.app.Activity.performCreate(Activity.java:5426)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
at android.app.ActivityThread.access$900(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoClassDefFoundError: android.support.v4.view.ViewConfigurationCompatFroyo
at android.support.v4.view.ViewConfigurationCompat$FroyoViewConfigurationVersionImpl.getScaledPagingTouchSlop(ViewConfigurationCompat.java:56)
at android.support.v4.view.ViewConfigurationCompat.getScaledPagingTouchSlop(ViewConfigurationCompat.java:105)
at android.support.v4.view.ViewPager.initViewPager(ViewPager.java:368)
at android.support.v4.view.ViewPager.<init>(ViewPager.java:356)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:600)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:359)
at android.app.Activity.setContentView(Activity.java:2010)
at android.visitabudhabi.com.vad.Walkthrough.onCreate(Walkthrough.java:32)
at android.app.Activity.performCreate(Activity.java:5426)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
at android.app.ActivityThread.access$900(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
这是我的带有 ViewPager 的 XML:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:orientation="vertical"
>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_
android:layout_
android:overScrollMode="never" />
<LinearLayout
android:layout_
android:layout_
android:layout_below="@+id/pager"
android:layout_gravity="bottom"
android:orientation="horizontal">
<ImageView
android:id="@+id/first"
android:layout_
android:layout_
android:layout_weight="3.3"
android:background="#c7333f" />
<ImageView
android:id="@+id/second"
android:layout_
android:layout_
android:layout_weight="3.3"
android:background="#FFF" />
<ImageView
android:id="@+id/third"
android:layout_
android:layout_
android:layout_weight="3.3"
android:background="#fff" />
</LinearLayout>
</FrameLayout>
有人知道怎么解决吗?
【问题讨论】:
请添加有viewpager的布局 @HosseinGerami 我会立即更新我的问题。 ***.com/questions/10780413/… @IntelliJAmiya 我所有的库都使用 Gradle 安装在项目中。 @Lefteris no 实际上我正在为 API 21 构建,请参阅我在问题中发布的 build.gradle 中的默认配置。 【参考方案1】:如果有人来,我就是这样解决问题的。
在我深入研究了这个问题之后,我发现这不是一个膨胀的异常,虽然这是 logcat 所说的,真正的异常是臭名昭著的 65K 问题click here for more information about the problem 引起的 OutOfMemory 异常,它被 inflate excpetion 包裹.
为了解决这个问题,我首先在我的 build.gradle 文件中添加了 multidex 支持库:
compile 'com.android.support:multidex:1.0.0'
然后我按照这三个简单的步骤使其工作:
如果您自己没有实现 Application 类,您可以在 Android 清单文件中的 application 标签下简单地定义库的 MultiDexApplication:
android:name="android.support.multidex.MultiDexApplication"
如果您要实现自己的 Application 类,您可以简单地覆盖 MultiDexApplication 文件:
公共类 MyAwesomeApplication 扩展 MultiDexApplication
或者,如果您的应用程序类已经在扩展另一个类,您可以重写 attachBaseContext 方法并为其添加以下调用:
@覆盖 受保护的无效 attachBaseContext(上下文基础) super.attachBaseContext(context); Multidex.install(this);
我已经有自己的应用程序类,它从“应用程序”类扩展而来,所以我直接跳到第 3 步,瞧,它在 Kitkat 和 Lollipop 上工作。
希望这对任何人都有帮助。快乐编码。
【讨论】:
很高兴看到。很好的解释。快乐的编码 它对我不起作用。我设置了 minSdkVersion 17 targetSdkVersion 26 renderScriptTargetApi 19 这是在我集成了 Realm 数据库之后发生的。请建议我一个解决方案。提前致谢 你的答案太奇怪了,如果你创建你的应用程序类,它当然会扩展Application
,所以第 2 点永远不会起作用,而第 3 点的上下文发生了什么:@Override protected void attachBaseContext(Context base) super.attachBaseContext(context); Multidex.install(this);
你有base
变量,但你试图不使用现有的 context
而只是 this
,太奇怪了
@user924 哇,你是个聪明人吧?我所说的第 2 点的意思是,如果您之前没有创建应用程序类,您可以创建一个并扩展 MultiDexApplication 而不是 Application,如果您在任何其他功能中不需要它,您可以将其留空。在第 3 点中,变量 base 引用了与单词 this 相同的对象,因此使用任何一个都是相同的,但不知何故取决于您的丰富经验,您会发现这很奇怪。非常感谢您指出这一点:)
@EyadMhanna 当然,当你在一两行代码中对同一个对象使用三个不同的变量时,这很奇怪,为什么不直接使用 this
三次呢?有谁写过这样的代码?【参考方案2】:
主要问题是您的 compileSdkVersion 与项目中包含的支持库的主要版本不匹配。请遵守以下规则:
将 targetSdkVersion 设置为 22,因为您想在 Lollipop 设备上使用 Lollipop 功能(暂时不关心 Marshmallow)。
将 compileSdkVersion 设置为 23,因为它是最新的。
将 buildToolsVersion 设置为“23.0.1”,因为它是最新的。
将支持库版本设置为最新匹配的compileSdkVersion:
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:support-v4:23.1.0'
compile 'com.android.support:recyclerview-v7:23.1.0'
compile 'com.android.support:cardview-v7:23.1.0'
【讨论】:
【参考方案3】:好的。第一次打电话fill_parent
。
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_
android:layout_
android:overScrollMode="never" />
用这个代替你的。
compile 'com.android.support:support-v4:21.0.3'
设置targetSdkVersion 19
编辑1
你设置
compileSdkVersion 23
buildToolsVersion "23.0.1"
和
targetSdkVersion 23
希望对你有帮助。
【讨论】:
测试用例集minSdkVersion 15
@Eyadoos 我不确定。试试这个并提供反馈
我不知道这是否可行,但即使可行,我也无法使用此解决方案,因为应用程序中的许多设计功能需要 API 21以上是关于Android Studio 项目适用于 Lollipop,但不适用于 Kitkat的主要内容,如果未能解决你的问题,请参考以下文章
适用于Android Studio的十六进制代码颜色库[关闭]
适用于 android 的 Visual Studio (2015) 模拟器无法正常工作 - XDE.exe - 退出代码 3
VSCode 中的 Flutter beta 热重载适用于 Web,但不适用于 iOS 和 Android(适用于 Android Studio)
哪些 Java SE 版本适用于 android studio 3.1?