以编程方式将ABOVE添加到LayoutParams会导致视图高度为0

时间:2013-09-03 20:51:41

标签: android android-layout relativelayout android-view

我有自定义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看起来与屏幕宽度相同。

  1. 我是否在添加规则时出错?
  2. 是否有更好的地方添加规则?是否需要先发生一些事情?
  3. 还有其他选择吗?使TextView的高度为FILL_PARENT,重力为BOTTOM,并将其下边距设置为图像的高度,但我需要能够在文本上方添加另一个视图,这不适用于这一点。

2 个答案:

答案 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);