Android RelativeLayout.getHeight返回0;研究完成但流行的解决方案给我错误

时间:2016-12-28 14:49:32

标签: android

编辑:我正在尝试获取视图的高度/宽度,以便我可以以编程方式将一些ImageView放入其中。但是,getHeight()getWidth()返回0,因此我无法将ImageView置于正确的位置。我确实在ImageViewRelativeView)上显示了main_activity

我知道与getHeight()返回0错误有关的答案:How to retrieve the dimensions of a view? Unfortunately不幸的是,它在ld.setLayerInset()行上给了我例外,说我正在尝试在空指针引用上调用该方法。我知道这种异常的含义,但我不明白我的代码有什么问题,因为我只是试图将上述链接上的代码复制并粘贴到我的代码中,并对变量名进行修改。以下是我的一些代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.activity_main).getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            LayerDrawable ld = (LayerDrawable) findViewById(R.id.activity_main).getBackground();
            ld.setLayerInset(1,0,0,0,0);
            if (Build.VERSION.SDK_INT >= 16) {
                findViewById(R.id.activity_main).getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } else {
                findViewById(R.id.activity_main).getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
        }
    });
...
}

我认为问题发生在getBackground()获取null然后导致下一行抛出异常,但我根本不知道是什么问题。

1 个答案:

答案 0 :(得分:0)

视图的大小与其背景无关。视图可以具有非零大小而没有背景(希望!)。你不必携带视图的bg。

然后是一个细节,findViewById(int)方法可能是一个非常沉重的调用,你应该调用一次。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final View mainView = findViewById(R.id.yourViewId)
    mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            // At this stage of layout, if your view is well positioned, its width and height aren't zero
            int width = mainView.getWidth();
            int height = mainView.getHeight();

            // Do whatever you want with view's size here

            if (Build.VERSION.SDK_INT >= 16) {
                mainView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } else {
                mainView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
        }
    });
...
}