我有一个应用程序,在屏幕底部有一个工具栏,其余的用自定义视图填充(参见下面的xml)。现在,当我将应用程序全屏显示时(我尝试了所有可能性,以编程方式并通过Manifest.xml),当它启动时,整个布局似乎向下移动了大约通知栏的高度。工具栏中的按钮仅在中途可见。有时候,所有这些都会在几秒钟之后或者当我单击工具栏中的按钮时向上移动。
我很确定,这是我的自定义视图的问题,因为如果我用Button等替换它,我就不会得到这个效果。我想它必须与onMeasure
方法有关。我真的不知道如何实现它,我的版本如下所示。自定义视图用于绘制内部,因此基本上它希望尽可能大。
非常感谢任何帮助。我已经搜索了几个小时,但还没有任何线索。
layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<com.example.MyCanvasView
android:id="@+id/canvas"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<!-- Buttonbar -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="4dp"
android:orientation="horizontal"
android:background="@android:drawable/bottom_bar"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3"
/>
</LinearLayout>
</LinearLayout>
这是我的onMeasure
方法:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(width, height);
}
答案 0 :(得分:2)
在设置测量时,您没有考虑该模式。
MeasureSpec
的模式可以是MeasureSpec.EXACTLY
,MeasureSpec.AT_MOST
或MeasureSpec.UNSPECIFIED
之一。只需接受尺寸组件并将您的测量尺寸设置为适合EXACTLY
,但对其他组件来说,这通常是正确的。
由于您在此自定义视图中尝试使用layout_weight
以及wrap_content
的高度,因此会发生以下情况:
您的自定义视图是LinearLayout的第一个子级,其高度为wrap_content
,因此LinearLayout
会对其进行测量。由于LinearLayout
LayoutParams
已告知wrap_content
MeasureSpec
AT_MOST
wrap_content
,match_parent
模式为LinearLayout
并且整个可用空间。
但是你的自定义视图很贪婪。它决定占用所有可用空间。从本质上讲,您已经实施了衡量标准,将layout_height
视为0dip
。
现在没有剩余空间了。下方的按钮栏会相应地进行测量但是还没有完成,有一个孩子有重量。在LinearLayout
所有正常测量完成后遗留的任何空间中,根据其权重值在加权儿童之间进行划分。这不是你想要的行为。
当您使用权重来填充此布局中的可用垂直空间时,通常需要将{{1}}设置为{{1}}。这将使{{1}}跳过该子项的第一个度量传递,并仅使用加权测量传递来测量您的视图,为其提供剩余的可用空间。
答案 1 :(得分:2)
我找到了描述行为的原因。我已经通过setFocusableInTouchMode(true)
方法中的onCreate()
将视图设置为可触摸模式。一旦我删除它,它工作正常。感谢adamp - 您对布局和测量过程中发生的事情的描述非常有趣。
但这让我不再接受任何按键/按钮点击的问题: - (