最近我们将应用中的targetSDK从21更新为23.
android {
compileSdkVersion 23
buildToolsVersion '23.0.1'
...
defaultConfig {
applicationId 'com.myapp'
minSdkVersion 15
targetSdkVersion 23
versionCode System.getenv("LAST_BUILD_NUMBER") as Integer ?: 1514261001
versionName '2.6.1' + (System.getenv("APP_VERSION_SUFFIX") ?: '')
testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
multiDexEnabled true
}
我们的应用程序还有一些小部件包含一些像这样的TextView:
<TextView
android:id="@+id/txt_sunrise"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_classic_weather_sunrise"
android:drawablePadding="6dp"
android:text="-"
android:textColor="@android:color/white"
android:textSize="@dimen/largeTextSizeAstro" />
小部件以这种方式构建:
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_large);
rv.setTextViewText(R.id.txt_sunrise, sunrise);
// some more code
appWidgetManager.updateAppWidget(appWidgetId, rv);
在Android 5.0上,一切运行正常,但在一些Android 4.x设备上(我可以在一些三星设备上以及Genymotion仿真器上重现它),我应该构建一个小部件时出现异常:
caused by: android.content.res.Resources$NotFoundException: Resource is not a ColorStateList (color or path): TypedValue{t=0x2/d=0x7f01018e a=2}
at android.content.res.Resources.loadColorStateList(Resources.java:2074)
at android.content.res.TypedArray.getColorStateList(TypedArray.java:342)
at android.widget.TextView.<init>(TextView.java:912)
at android.widget.TextView.<init>(TextView.java:578)
当我检查给定的资源-Id 0x7f01018e时,发现这是在app主题中定义的colorAccent,当然不是颜色状态列表
<style name="AppTheme" parent="Theme.AppCompat">
<item name="colorPrimary">@color/grey_darker</item>
<item name="colorPrimaryDark">#111111</item>
<item name="colorAccent">@color/orange</item>
任何想法,为什么我收到此错误?
答案 0 :(得分:1)
我在特定平台和给定行号上的android Textview的源代码中深入研究,我在构造函数方法中找到了这个片段:
case com.android.internal.R.styleable.TextView_textColorLink:
textColorLink = a.getColorStateList(attr);
break;
我的解决方案现在是将以下行添加到我的主题中,并且小部件再次工作:
<item name="android:textColorLink">@color/selector_classic_link</item>
注意:selector_classic_link是在xml中定义的ColorStateList。