我正在使用自定义视图显示渐变颜色填充的TextView如下:
public class GradientTextView extends TextView {
public GradientTextView(Context context) {
super(context, null, -1);
}
public GradientTextView(Context context,
AttributeSet attrs) {
super(context, attrs, -1);
}
public GradientTextView(Context context,
AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if (!isInEditMode()) {
GradientTextView.getTextColor(context, null, defStyle);
}
}
@Override
protected void onLayout(boolean changed,
int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (changed) {
getPaint().setShader(new LinearGradient(
0, 0, 0, getHeight(),
Color.parseColor(Color.WHITE), Color.parseColor(Color.BLACK),
Shader.TileMode.CLAMP));
}
}
}
它可以在设备或模拟器上正常工作,但我在Android工作室的xml预览器中得到渲染问题,建议在自定义视图中使用View.isInEditMode()来跳过代码或在IDE中显示时显示示例数据并显示此错误堆栈:
java.lang.NullPointerException
有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
指示此视图当前是否处于编辑模式。在开发人员工具中显示时,视图通常处于编辑模式...
以下是您的自定义视图布局文件的外观:
<com.example.android.customviews.GradientTextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" />
以及相应的视图类:
package com.example.android.customviews;
public class GradientTextView extends TextView {
public GradientTextView(Context context) {
this(context, null);
}
public GradientTextView(Context context, AttributeSet attrs) {
this(context, attrs, -1);
}
public GradientTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if (!isInEditMode()) {
GradientTextView.getTextColor(context, null, defStyle);
}
}
@Override
protected void onLayout(boolean changed,
int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (changed) {
getPaint().setShader(
new LinearGradient(0, 0, 0, getHeight(),
Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP));
}
}
}
注意:我遗漏了你的其他构造函数,但是看看在提供的构造函数中我是如何在isInEditMode()
检查中包装内容的。