Blankj / AndroidUtilCode

:fire: Android developers should collect the following utils(updating).
https://blankj.com/2016/07/31/android-utils-code/
Apache License 2.0
33.32k stars 10.69k forks source link

ToastUtils.java在低于API 23时报错 #279

Closed limuyang2 closed 7 years ago

limuyang2 commented 7 years ago

跟踪错误后,发现,在ToastUtils.java中第214行有如下一句话: TextViewCompat.setTextAppearance(tvMessage, android.R.style.TextAppearance); setTextAppearance会在低于API 23的机子上报错,建议执行此句时进行版本判断

希望修复

Blankj commented 7 years ago

我API19 都不会报错 你具体看是什么错

limuyang2 commented 7 years ago

刚刚错误代码贴错了,是以下这些: 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)

limuyang2 commented 7 years ago

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. 你新建一个工程,应该可以复现错误

Blankj commented 7 years ago

因为你v4版本低,那个函数是23才加进去的,你compileSdkVersion升到23以上就行

limuyang2 commented 7 years ago

对的,就是低于api 23找不到此方法,所以希望能加入版本判断

Blankj commented 7 years ago

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吗 🤣 ,这是不科学的做法。

limuyang2 commented 7 years ago

首先这是在一个同事的老项目上出现的,如果设置compileSdkVersion为23,那么项目的动态权限需要重做,因为时间关系,暂不允许大于23。

limuyang2 commented 7 years ago

实际项目环境比较复杂,不一定会跟新版本走。特别是老项目

limuyang2 commented 7 years ago

谢谢你的回复,老项目就先暂时弃用次方法

Blankj commented 7 years ago

targetSdkVersion 设为23以下就好, compileSdkVersion设高没事的吧

Blankj commented 7 years ago

不行的话拷贝下我那个类,然后替换成下面就好了

if (Build.VERSION.SDK_INT >= 23) {
    tvMessage.setTextAppearance(android.R.style.TextAppearance);
} else {
    tvMessage.setTextAppearance(tvMessage.getContext(), android.R.style.TextAppearance);
}
limuyang2 commented 7 years ago

不好意思,对,是targetSdkVersion 23。 最后谢谢你的耐心回复