android - 如何检索 View 的尺寸?

标签 android layout android-widget lifecycle measure

我有一个由 TableLayout、TableRow 和 TextView 组成的 View 。我希望它看起来像一个网格。我需要得到这个网格的高度和宽度。 getHeight()getWidth() 方法总是返回 0。当我动态格式化网格以及使用 XML 版本时会发生这种情况。

如何检索 View 的尺寸?


这是我在 Debug 中用来检查结果的测试程序:

import android.app.Activity;
import android.os.Bundle;
import android.widget.TableLayout;
import android.widget.TextView;

public class appwig extends Activity {  
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.maindemo);  //<- includes the grid called "board"
      int vh = 0;   
      int vw = 0;

      //Test-1 used the xml layout (which is displayed on the screen):
      TableLayout tl = (TableLayout) findViewById(R.id.board);  
      tl = (TableLayout) findViewById(R.id.board);
      vh = tl.getHeight();     //<- getHeight returned 0, Why?  
      vw = tl.getWidth();     //<- getWidth returned 0, Why?   

      //Test-2 used a simple dynamically generated view:        
      TextView tv = new TextView(this);
      tv.setHeight(20);
      tv.setWidth(20);
      vh = tv.getHeight();    //<- getHeight returned 0, Why?       
      vw = tv.getWidth();    //<- getWidth returned 0, Why?

    } //eof method
} //eof class

最佳答案

我相信 OP 早已不复存在,但如果这个答案能够帮助 future 的搜索者,我想我会发布一个我找到的解决方案。我已将此代码添加到我的 onCreate() 方法中:

已编辑: 2011 年 7 月 5 日以包含评论中的代码:

final TextView tv = (TextView)findViewById(R.id.image_test);
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        LayerDrawable ld = (LayerDrawable)tv.getBackground();
        ld.setLayerInset(1, 0, tv.getHeight() / 2, 0, 0);
        ViewTreeObserver obs = tv.getViewTreeObserver();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            obs.removeOnGlobalLayoutListener(this);
        } else {
            obs.removeGlobalOnLayoutListener(this);
        }
    }

});

首先,我获得了对 TextView 的最终引用(在 onGlobalLayout() 方法中访问)。接下来,我从 TextView 中获取 ViewTreeObserver,并添加一个 OnGlobalLayoutListener,覆盖 onGLobalLayout(似乎没有成为在此处调用的父类(super class)方法...)并将我的代码添加到此监听器中,这需要了解 View 的测量值。对我来说一切正常,所以我希望这能有所帮助。

关于android - 如何检索 View 的尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4142090/

相关文章:

javascript - 为 JS 和 Java 编写代码

android - React Native 权限不打印状态

java - 更改 KeyPress 上 JTextField 的大小

android - 自定义微调器项目未作为微调器的一部分出现

android - 从原生 Android 主屏幕小部件调用 Flutter (Dart) 代码

当 Wifi 连接丢失时,java.io.InputStream 不会抛出 IOException

java - 如何将 Button 对齐到 LinearLayout 中的最右角?

javascript - 仅当div高于一定高度时才在div底部显示 "expand"按钮

android - 如何在android中将按钮对齐到正确的位置

android - Sugar Orm 在新添加的列中保存新数据后返回默认值(升级 Sugar Orm)