【问题标题】:How to write set methods of custom Views如何编写自定义视图的设置方法
【发布时间】:2015-09-10 18:55:51
【问题描述】:

我编写了View 的子类,并且包含了一个设置字段的方法。该字段的值会影响View 的大小和View 的内容。

我必须在set 方法中写什么以确保视图将立即正确更新?我问是因为当我使用自己的自定义视图作为ListView 项目布局的一部分时,我发现当我尝试使用ArrayAdapter 的@987654328 的convertView 参数来回收我自己的视图时@ 方法,有时set 方法似乎不起作用。

这是我正在尝试做的事情的人为示例。我才刚刚开始学习如何扩展View,所以这段代码可能还有其他问题。

public final class SpotsView extends View {

    private final MyActivity activity;
    private int numberOfSpots;

    public SpotsView(MyActivity activity) {
        super(activity);
        this.activity = activity;
    }

    public void setNumberOfSpots(int numberOfSpots) {
        this.numberOfSpots = numberOfSpots;
        // What do I have to write here?? invalidate()? forceLayout()?
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Resources resources = activity.getResources();
        setMeasuredDimension(
            (int) (numberOfSpots * resources.getDimension(R.dimen.block_width)),
            (int) resources.getDimension(R.dimen.spots_view_height)
        );
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int height = getHeight();
        int width = getWidth();
        float radius = activity.getResources().getDimension(R.dimen.network_outer_radius);
        for (int i = 0; i < numberOfSpots; i++)
            canvas.drawCircle((i + 0.5F) * (width / numberOfSpots), height * 0.5F, radius, activity.spotPaint());
    }
} 

【问题讨论】:

    标签: android android-view


    【解决方案1】:

    看来你得打电话了

    invalidate();
    requestLayout();
    

    根据TextView#setCompoundDrawablePadding()的源代码,一个影响视图内容和大小的方法。

    【讨论】:

    • 它似乎有效。问题是forceLayout() 似乎也有效。我不确定“请求”布局是否足够强大。如果请求布局保证布局,forceLayout() 的意义何在?这个答案中的图表stackoverflow.com/a/25846243/3973077 建议requestLayout() 没有invalidate() 应该足够了。
    • 当它起作用时,你应该去使用它。单独调用 invalidate() 只会触发 draw() 方法而不是重新计算布局,如下所示:stackoverflow.com/questions/13856180/… requestLayout() 和 forceLayout() 之间的区别不是很清楚,但是 requestLayout() 肯定更好变化。
    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多