0

我在尝试为自定义视图的宽度设置特定大小时遇到​​问题。我知道我可以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?任何帮助都将是有用的和感激的!谢谢!

4

2 回答 2

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 回调时获得的值不同来确认此操作的正确性。

于 2013-04-18T00:22:25.883 回答
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屏幕宽度的一半,然后将其传递给超类。

于 2013-04-18T00:32:38.830 回答