我有自定义View
。在视图的构造函数中,我创建并添加了两个子视图。但是,使用LayoutParams.addRule()
会导致一些问题。 CENTER_HORIZONTAL
等规则有效,但当我尝试使用ABOVE
时,子视图最终的高度为0。
以下是构造函数中的代码:
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
mLayoutParams = new LayoutParams(width, height);
mLayoutParams.leftMargin = left;
mLayoutParams.topMargin = top;
mImage = new ImageView(getContext());
mImage.setImageDrawable(getResources().getDrawable(R.drawable.my_image_drawable));
mImage.setScaleType(ScaleType.FIT_XY);
mImage.setId(R.id.my_image_id);
addView(mImage, mLayoutParams);
mText = new TextView(getContext());
mText.setText(R.string.my_text);
mText.setId(R.id.my_text_id);
LayoutParams textParams = new LayoutParams(200, 40);
// textParams.addRule(CENTER_HORIZONTAL, TRUE); //Works
textParams.addRule(ABOVE, mImage.getId()); //Doesn't work
addView(mText, textParams);
如果我使用设备监视器检查仿真器上的视图,我可以看到文本的layout_height
为40,但top,bottom和height参数都为0. measuredHeight
看起来与屏幕宽度相同。
TextView
的高度为FILL_PARENT,重力为BOTTOM,并将其下边距设置为图像的高度,但我需要能够在文本上方添加另一个视图,这不适用于这一点。答案 0 :(得分:1)
你的代码在哪里检查身高?如果它位于onCreate或onCreateView中,您将无法获得任何信息。布局是一个两遍过程,在这两个方法中,两个过程都不完整。
您可能需要使用“.post”方法获取这些方法的高度,如下所示:
myView.post( new Runnable() {
@Override
public void run() {
int height = myView.getHeight();
}
});
runnable使它在UI线程上运行,但是在两次传递,度量传递和布局传递完成后调用它。因此,尝试在不首先了解测量值的情况下基于中心水平设置规则将失败。
答案 1 :(得分:0)
// try this
mText = new TextView(getContext());
mText.setText(R.string.my_text);
mText.setId(R.id.my_text_id);
RelativeLayout.LayoutParams textParams = new RelativeLayout.LayoutParams(200, 40);
// textParams.addRule(CENTER_HORIZONTAL, TRUE); //Works
textParams.addRule(RelativeLayout.ABOVE, mImage.getId()); //Doesn't work
addView(mText, textParams);