我在尝试为自定义视图的宽度设置特定大小时遇到​​麻烦。 我知道我可以在XML文件的layout_width字段中对值进行硬编码,但是我试图不对值进行硬编码。 我需要“ 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正确指定特定大小? 任何帮助将是有益和赞赏的! 谢谢!

===============>>#1 票数: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回调时获得的值是否不同来确认此方法的正确性。

===============>>#2 票数: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的宽度重写为恰好是屏幕宽度的一半,然后将其传递给超类。

  ask by chRyNaN translate from so

未解决问题?本站智能推荐: