编辑:我正在尝试获取视图的高度/宽度,以便我可以以编程方式将一些ImageView
放入其中。但是,getHeight()
和getWidth()
返回0,因此我无法将ImageView
置于正确的位置。我确实在ImageView
(RelativeView
)上显示了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
然后导致下一行抛出异常,但我根本不知道是什么问题。
答案 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);
}
}
});
...
}