在运行时获取RelativeLayout的维度

时间:2013-12-06 18:38:04

标签: java android runtime relativelayout dimension

我试图获得在下图中以红色突出显示的RelativeLayout的宽度和高度尺寸(以像素为单位)。

enter image description here

在我的下面的代码中,出于测试目的,我将RelativeLayout中Button的文本设置为整个布局的宽度(在图片中以蓝色圈出)。在图片中,您可以看到宽度返回值0.以下是我的代码。

@Override
protected void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);

    relativelayout = new RelativeLayout(getApplicationContext());
    puzzleRL = new RelativeLayout(getApplicationContext());

    puzzleLayout();

    puzzleRL.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            puzzleRL.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            puzzleWidth = puzzleRL.getWidth();
            puzzleHeight = puzzleRL.getHeight();
        }
    });

    levelCounter.setText("" + puzzleWidth);

    setContentView(relativelayout);
}

public void puzzleLayout() {

    // define puzzle space boundaries
    RelativeLayout.LayoutParams params0 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    params0.addRule(RelativeLayout.BELOW, view0.getId());
    params0.addRule(RelativeLayout.ABOVE, view3.getId());
    relativelayout.addView(puzzleRL, params0);

}

我环顾四周,似乎我需要使用onWindowFocusChanged(boolean hasFocus)方法。但它仍然以宽度返回0。我甚至尝试将我的onCreate()方法中的所有声明和当前位于puzzleLayout()方法中的所有布局代码放入onWindowFocusChanged(boolean hasFocus)方法中,但它仍然没有返回正确的事。

onWindowFocusChanged(boolean hasFocus)这是不正确的方法吗?或者我可能错误地获得尺寸getWidth()/getHeight()

修改 我修改了我的代码以反映评论者的建议。但是,levelCounter TextView仍然输出0.任何想法?

2 个答案:

答案 0 :(得分:2)

布局的宽度和高度(未明确定义)仅在绘制完所有子项后给出。

这是我使用的代码:

//layout = (RelativeLayout) findViewById(R.id.layout);

layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {

    // Ensure you call it only once :
        layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        width = layout.getWidth();// width must be declare as a field
        height = layout.getHeight;// height must be declare as a field
        levelCounter.setText("" + width);´
    }
});  

必须在onCreate。

答案 1 :(得分:0)

您可能希望将代码移动到onResume(),而不是将其保存在onWindowsFocusChanged()中,因为只要活动改变焦点(增益或失去焦点),就会调用后者。 不要忘记使用标志(或类似)执行一次代码。否则,您将每次都重新创建所有按钮。

顺便说一句,您可能想尝试:

bList[0].setText(String.valueOf(w));

编辑: 所有创建代码都应该在onCreate()中。 在onResume()里面,它是活动可见阶段的一部分,你可以gt维度:

puzzleRL.measure(0, 0);
puzzleRL.getMeasuredHeight();
puzzleRL.getMeasuredWidth();

您还可以将延迟的Runnable(500毫秒延迟)发布到处理程序,以便在onResume之后进行测量。 希望它适合你。