这是我的代码,我希望像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
不起作用?
答案 0 :(得分:10)
问题在于View
从布局xml
中膨胀时发生的事情的顺序。
如果您浏览code课程的LayoutInflater
,则会看到订单是:
xml
解析为attrs
(xml
与特定ViewGroup
孩子相关的特定部分)View
LayoutParams
attrs
醇>
这意味着您在构造函数(LayoutParams
)中创建的lp
被LayoutParams
中的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()
可以用来设置所需的尺寸。