如何指定自定义视图的宽度?

时间:2013-04-18 00:12:05

标签: java android view size android-view

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

2 个答案:

答案 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覆盖为屏幕宽度的一半,然后将其传递给超类。