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

时间:2016-05-22 10:58:51

标签: android

这是我的代码,我希望像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 个答案:

答案 0 :(得分:10)

问题在于View从布局xml中膨胀时发生的事情的顺序。

如果您浏览code课程的LayoutInflater,则会看到订单是:

  1. xml解析为attrsxml与特定ViewGroup孩子相关的特定部分)
  2. 创建View
  3. 根据之前获得的LayoutParams
  4. 设置attrs

    这意味着您在构造函数(LayoutParams)中创建的lpLayoutParams中的xml覆盖(在3.步骤中)。

    您可以采取哪些措施来解决这个问题,即将您的ii()电话转移到onAttachedToWindow()方法。

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        ii();
    }
    

答案 1 :(得分:0)

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

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

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