java - 在运行时获取 RelativeLayout 的尺寸

标签 java android runtime android-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() 不正确?

编辑 我已经更改了我的代码以反射(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/

相关文章:

java - 如何编写正则表达式来分割这种格式的字符串?

java - 使用 DocumentFilter 过滤 JTextField 中的字符串、空格和点 (.)

java - DB-sqlite android,不工作

algorithm - 什么更大 : O(mn) OR O((m^2)/n)?

c# - 如何在运行时生成未知类型的实例?

java - Runtime.getRuntime().exec() 平台独立吗?

java - 水平翻转 (X) ParticleEffect [Libgdx]

java - 带有 $ 符号的 Android 或 Java 类命名

android - 致命异常 applicationId 为空解析

java - 为什么 Android Java 中 putInt 需要字符串?