我试图获得在下图中以红色突出显示的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()
?
修改
我修改了我的代码以反映评论者的建议。但是,levelCounter
TextView仍然输出0.任何想法?
答案 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之后进行测量。 希望它适合你。