gpt4 book ai didi

android - 全屏应用程序,布局按通知栏高度向下移动

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:49:45 27 4
gpt4 key购买 nike

我有一个应用程序,它在屏幕底部有一个工具栏,其余部分充满了自定义 View (请参阅下面的 xml)。现在,当我使应用程序全屏显示时(我以编程方式和通过 Manifest.xml 尝试了所有可能性),当它启动时,整个布局似乎向下移动了大约通知栏的高度。工具栏中的按钮只能显示一半。有时,所有这些都会在几秒钟后向上移动,或者当我单击工具栏中的按钮时。

enter image description here

我很确定,这是我的自定义 View 的问题,因为如果我用按钮等替换它,我就不会得到这种效果。我想这一定与 onMeasure 方法有关。我真的不知道如何实现它,我的版本如下所示。自定义 View 用于内部绘图,所以基本上它希望尽可能大。

任何帮助将不胜感激。我已经搜索了几个小时,但还没有任何线索。

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);
}

最佳答案

您在设置测量时没有考虑模式。

MeasureSpec 的模式可以是 MeasureSpec.EXACTLYMeasureSpec.AT_MOSTMeasureSpec.UNSPECIFIED 之一。简单地接受尺寸组件并将您的测量尺寸设置为适合EXACTLY 的尺寸,但对于其他组件而言通常不是正确的。

因为您尝试在此自定义 View 上使用 layout_weight 以及 wrap_content 的高度,所以发生了以下情况:

您的自定义 View 是高度为 wrap_content 的 LinearLayout 的第一个 subview ,因此 LinearLayout 对其进行测量。由于 LayoutParams 已告知 LinearLayout 它应该 wrap_content,因此它使用 MeasureSpec 模式测量您的自定义 View AT_MOST 和整个可用空间的大小。

但是你的自定义 View 是贪心的。它决定占用所有可用空间。本质上,您已经实现了将 wrap_content 视为 match_parent 的测量。

现在没有更多空间了。下面的按钮栏得到相应的测量,但还没有完成,有一个 child 有体重。在 LinearLayout 中,所有正常测量完成后剩余的任何空间都会根据权重值分配给加权子项。这不是您想要的行为。

当您像在此布局中那样使用权重填充可用的垂直空间时,通常需要将 layout_height 设置为 0dip。这将使 LinearLayout 跳过该子项的第一个测量传递并仅使用加权测量传递来测量您的 View ,为其提供剩余的可用空间。

关于android - 全屏应用程序,布局按通知栏高度向下移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5357568/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com