我正在尝试获取下图中以红色突出显示的 RelativeLayout 的宽度和高度(以像素为单位)的尺寸。
在我下面的代码中,出于测试目的,我将 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()
不正确?
编辑
我已经更改了我的代码以反射(reflect)评论者的建议。然而,levelCounter
TextView 仍然输出 0。有什么想法吗?
最佳答案
Layout 的宽度和高度,当它们没有明确定义时,只有在绘制完所有子项后才给出。
这是我使用的代码:
//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 中。
关于java - 在运行时获取 RelativeLayout 的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20431198/