Closed limuyang2 closed 7 years ago
我API19 都不会报错 你具体看是什么错
刚刚错误代码贴错了,是以下这些: java.lang.NoSuchMethodError: No static method setTextAppearance(Landroid/widget/TextView;I)V in class Landroid/support/v4/widget/TextViewCompat; or its super classes (declaration of 'android.support.v4.widget.TextViewCompat' appears in /data/app/com.example.mumu.myapplication-2/split_lib_dependencies_apk.apk:classes2.dex) at com.blankj.utilcode.util.ToastUtils$1.run(ToastUtils.java:214) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
android { compileSdkVersion 22 buildToolsVersion "26.0.1" defaultConfig { applicationId "com.example.mumu.myapplication" minSdkVersion 15 targetSdkVersion 22 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:22.1.0' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' compile 'com.blankj:utilcode:1.9.0' }
这是gradle配置,一个新建的测试项目,API均为22. 你新建一个工程,应该可以复现错误
因为你v4版本低,那个函数是23才加进去的,你compileSdkVersion升到23以上就行
对的,就是低于api 23找不到此方法,所以希望能加入版本判断
TextViewCompat里实现了版本判断的,但你现在所谓的版本判断是你使用的安卓编译sdk版本不对,开发者一般都是跟着最新的走的,照你所说那你minSdkVersion为15,那你compileSdkVersion也应该为15才对啊,compileSdkVersion和最终编译进去的源码有关,你版本低肯定会报低版本所没有的错,就像你用5.0的编译,那最终编译出的肯定找不到7.0新加的东西。 作为开发者compileSdkVersion当然要用最新的哈。至于你说的要加判断,即使我加了android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M )
那你那边也会出现找不到Build.VERSION_CODES.M
,因为Build.VERSION_CODES.M
是23才出现的,而你编译的才22,难不成你让我写 >= 23吗 🤣 ,这是不科学的做法。
首先这是在一个同事的老项目上出现的,如果设置compileSdkVersion为23,那么项目的动态权限需要重做,因为时间关系,暂不允许大于23。
实际项目环境比较复杂,不一定会跟新版本走。特别是老项目
谢谢你的回复,老项目就先暂时弃用次方法
targetSdkVersion 设为23以下就好, compileSdkVersion设高没事的吧
不行的话拷贝下我那个类,然后替换成下面就好了
if (Build.VERSION.SDK_INT >= 23) {
tvMessage.setTextAppearance(android.R.style.TextAppearance);
} else {
tvMessage.setTextAppearance(tvMessage.getContext(), android.R.style.TextAppearance);
}
不好意思,对,是targetSdkVersion 23。 最后谢谢你的耐心回复
跟踪错误后,发现,在ToastUtils.java中第214行有如下一句话:
TextViewCompat.setTextAppearance(tvMessage, android.R.style.TextAppearance);
setTextAppearance会在低于API 23的机子上报错,建议执行此句时进行版本判断希望修复