我在尝试为自定义视图的宽度设置特定大小时遇到问题。我知道我可以在layout_width
文件的XML
字段中对一个值进行硬编码,但我不想导致硬编码值。我需要View
的大小是屏幕的一半。因此,在class
内,我找到了屏幕尺寸的一半:
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
try{
Point size = new Point();
display.getSize(size);
screenWidth = size.x;
}catch(NoSuchMethodError e){
screenWidth = display.getWidth();
}
然后,我打电话给:
measure(width|MeasureSpec.EXACTLY, LayoutParams.WRAP_CONTENT|MeasureSpec.EXACTLY);
//Where width is equal to half the screen width
但这似乎对我的情况不起作用。 所以,总结一下,如何为自定义View
正确指定特定尺寸?任何帮助将是有用的和赞赏!谢谢!
答案 0 :(得分:0)
我认为您可能无法准确获取屏幕的宽度,因为您需要等到整个层次结构(直到最根视图)布局。您可能需要执行以下操作:
ViewTreeObserver.OnGlobalLayoutListener layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int width = getWidth();
int height = getHeight();
//set layoutparams with those values.
}
};
getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
您可以通过查看在尝试获取onMeasure内部的显示宽度时获得的值是否与调用onGlobalLayout回调时获得的值不同来确认其正确性。
答案 1 :(得分:0)
覆盖自定义视图中的onMeasure()
方法:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getResources().getDisplayMetrics().widthPixels >> 1;
widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
基本上,将宽度MeasureSpec
覆盖为屏幕宽度的一半,然后将其传递给超类。