IME的自定义Android视图部分被切断了吗?

时间:2014-04-12 13:36:43

标签: java android android-custom-view ime

我正在开发一款适用于Android的IME,为此我创建了一个自定义视图。

我在这样的XML文件中设置视图:

<com.paldepind.mykeyboard.KeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
/>

我希望视图占屏幕高度的40%。因此,在我的自定义视图中,我覆盖了视图具有的onMeasure方法:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int height = (int) (View.MeasureSpec.getSize(heightMeasureSpec) * .4);
    setMeasuredDimension(widthMeasureSpec,
                         View.MeasureSpec.makeMeasureSpec(height,
                         View.MeasureSpec.EXACTLY));
}

在手机上观看时,视图在屏幕上正确开始降低60% - 但它会被进一步向下切断,如下面的屏幕截图所示。

Android screenshot

如果我将上面代码中的.4更改为1,则视图会按预期填满整个屏幕。似乎数字越低,视图被切断的越多。

我真的无法弄清楚为什么这不起作用。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

似乎onMeasure方法由于某种原因开始被调用两次。第一次heightMeasureSpec参数等于屏幕大小,第二次将参数设置为视图的前一个设置高度。因此,该视图的屏幕尺寸仅为40%,仅为40%。

我已通过在onMeasure方法调用中专门获取屏幕尺寸来修复此问题:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int height = (int) (size.y * .4);
    setMeasuredDimension(widthMeasureSpec,
                         View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY));
}

答案 1 :(得分:0)

尝试将键盘视图放在相对布局中。也许可以解决它。