【问题标题】:How to correctly size containing views如何正确调整包含视图的大小
【发布时间】:2011-02-13 03:14:30
【问题描述】:

我有一个Activity,它将显示一个由两部分组成的自定义视图。我希望一部分为可见屏幕高度的 1/3,另一部分为 2/3。

我可以覆盖 onMeasure() 并使用显示指标来查找显示的高度,但这不考虑电池条或视图标题的大小。

DisplayMetrics dm = new DisplayMetrics(); 
((WindowManager)contxt.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm); 
int height = dm.heightPixels;

如何判断可显示区域的高度?我准备覆盖layout 或其他。 Android 的最佳实践是什么?我也看到过其他类似的问题,但都没有定论。

【问题讨论】:

    标签: android android-layout layout view size


    【解决方案1】:

    我想出了一个办法。我重写了RelativeLayout,并让它保持指向我的上视图和下视图的指针。然后,当它处理 onMeasure 时,它​​会在我的 2 个视图上设置所需的高度。他们在处理 onMeasure 时使用所需的高度。这给了我一个位于可见区域 2/3 处的视图,而另一个位于下方。

    -- 来自我的 Layout 类

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // set default screen heights
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        if ( upper != null )
            upper.setPrefHeight((heightSize*2)/3);
        if ( lower != null )
            lower.setPrefHeight(heightSize/3);
    
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    
    }
    

    --来自视图派生类

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(measureWidth(widthMeasureSpec),
                measureHeight(heightMeasureSpec));
    }
    
    /**
     * Determines the width of this view
     * @param measureSpec A measureSpec packed into an int
     * @return The width of the view, honoring constraints from measureSpec
     */
    private int measureWidth(int measureSpec) {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
    
        if (specMode == MeasureSpec.EXACTLY) {
            // We were told how big to be
            result = specSize;
        } else {
            DisplayMetrics dm = new DisplayMetrics(); 
            ((WindowManager)contxt.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm); 
            result = dm.widthPixels; 
        }
        width = result;
        return result;
    }
    
    /**
     * Determines the height of this view
     * @param measureSpec A measureSpec packed into an int
     * @return The height of the view, honoring constraints from measureSpec
     */
    private int measureHeight(int measureSpec) {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
    
        if (specMode == MeasureSpec.EXACTLY) {
            // We were told how big to be
            result = specSize;
        } else {
            result = prefHeight;
        }
        height = result;
    
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      相关资源
      最近更新 更多