如何强制设置自定义视图的布局参数

6
这是我的代码,我希望将其视为HTML5中的视图。<hr/>
public class Hr extends View {

    public Hr(Context context) {
        super(context);
        ii();
    }

    public Hr(Context context, AttributeSet attrs) {
        super(context, attrs);
        ii();
    }

    void ii() {
        setBackgroundColor(col(this, R.color.gray));
        ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(MATCH_PARENT, 1);
        lp.topMargin = 5;
        lp.bottomMargin = 5;
        setLayoutParams(lp);
    }
}

但是当我测试它时:
<ro.adr.Hr android:layout_width="match_parent" android:layout_height="match_parent"/>

结果是灰色块,为什么lp不起作用?

enter image description here

2个回答

21
问题出在从布局xml中膨胀(inflated)View的顺序上。
如果您查看LayoutInflater类的代码,则会发现顺序是:
  1. xml解析为attrs(与特定ViewGroup子项相关的xml的特定部分)
  2. 创建View
  3. 基于先前获取的attrs创建LayoutParams
这意味着您在构造函数(lp)中创建的LayoutParams将被xml中的LayoutParams(在第3步中)覆盖。
要解决这个问题,您可以将ii()调用移动到onAttachedToWindow()方法中。
@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    ii();
}

4

对于自定义视图,您可以覆盖 onMeasure() 方法,例如:

 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(500,500);
    }

setMeasuredDimension()可用于设置所需的尺寸。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接