如何在自定义视图中使用View.isInEditMode()来跳过代码?

时间:2014-02-02 18:57:53

标签: xml layout android-custom-view

我正在使用自定义视图显示渐变颜色填充的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

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

View.isInEditMode

  

指示此视图当前是否处于编辑模式。在开发人员工具中显示时,视图通常处于编辑模式...

以下是您的自定义视图布局文件的外观:

<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()检查中包装内容的。