当前位置: 首页 > 知识库问答 >
问题:

Android:如何使自定义视图只占用可用的屏幕空间?

平庆
2023-03-14

我有两个自定义视图,我想垂直布局。第一种观点是一种游戏板,它是一个正方形。方块缩放容易,可以适应几乎任何可用的空间。

第二个视图是[TableLayout][1]的子类,它包含几个按钮。行/列的数量在运行时确定。

为了便于解释,我将调用第一个view board和第二个one Table。

我希望板显示在屏幕的顶部和桌子应该在它的正下方。表应该占用它所需要的垂直空间(这基本上取决于行数)。板材应将其正方形边缘尺寸设置为可用宽度和可用高度的最小值,即向下缩放。

我试图使用[RelativeLayout][2]来实现这一点,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="@dimen/default_padding"
                >

    <some.package.Table
        android:id="@+id/table"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="@dimen/default_padding"
        />

    <some.package.Board
        android:id="@+id/board"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_above="@id/table"
        />
</RelativeLayout>

使用这种方法,我希望首先测量表,并将剩余的可用屏幕高度作为最大(即at_most)高度规格传递给板的onmeasure。这种假设似乎是错误的。

当我使用这个布局时,板的大小似乎被调整为零大小,即它没有呈现。

当我像这样把事情扭转过来:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="@dimen/default_padding"
                >

    <some.package.Board
        android:id="@+id/board"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        />

    <some.package.Table
        android:id="@+id/table"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="@dimen/default_padding"
        android:layout_below="@id/board"
        />
</RelativeLayout>

这块木板占据了太多的垂直空间,桌子的底部被切掉了

在这两种情况下,板获得的显示宽度为at_most宽度规格,显示高度(减去状态栏和操作栏高度)为at_most高度规格。因此,我的onmeasure实现将两者中的最小值取为正方形大小,这样就没有为表视图留出足够的空间。

谁能告诉我怎么做这件事吗?我可能需要添加嵌套布局吗?还是使用布局权重?-我没有这样做,因为在我的理解中,重量是相对尺寸的。

谢谢和亲切问候

盖比回答后编辑:

在尝试了Gabe的建议之后,我在board和table的onmeasure方法中记录了一些数据:

table: wM=EXACTLY minW=0 ws=736 hM=EXACTLY minH=0 hs=1006
board: wM=AT_MOST minW=0 ws=736 hM=AT_MOST minH=0 hs=1006
board: wM=EXACTLY minW=0 ws=736 hM=EXACTLY minH=0 hs=1006
table: wM=EXACTLY minW=0 ws=736 hM=AT_MOST minH=0 hs=0
I/Choreographer﹕ Skipped 206 frames!  The application may be doing too much work on its main thread.
D/dalvikvm﹕ GC_FOR_ALLOC freed 305K, 8% free 4880K/5252K, paused 103ms, total 105ms
table: wM=EXACTLY minW=0 ws=736 hM=EXACTLY minH=0 hs=1006
board: wM=AT_MOST minW=0 ws=736 hM=AT_MOST minH=0 hs=1006
board: wM=EXACTLY minW=0 ws=736 hM=EXACTLY minH=0 hs=1006
table: wM=EXACTLY minW=0 ws=736 hM=AT_MOST minH=0 hs=0

wM是MeasureSec中的宽度模式,minW是GetSugGestedMinimumWidth(),ws是MeasureSec中的宽度大小。同样适用于hM、minH和HS。

我没有重写table中的onMeasure(是的,我重写了,但它只是记录数据并调用super.onMeasure())。前面介绍了board.onMeasure()中实现的行为。

我还是很迷惑...

在Kha回答后编辑:

卡的建议奏效了。工作的XML布局是

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="@dimen/default_padding"
                >

    <some.package.Table
        android:id="@+id/table"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="@dimen/default_padding"
        android:layout_alignParentBottom="true"
        />

    <some.package.Board
        android:id="@+id/board"
        android:layout_height="match_parent"
        android:layout_width="wrap_content"
        android:layout_above="@id/table"
        />

</RelativeLayout>

日志记录输出现在为:

board: wM=AT_MOST minW=0 ws=736 hM=AT_MOST minH=0 hs=1006
table: wM=EXACTLY minW=0 ws=736 hM=EXACTLY minH=0 hs=1006
table: wM=EXACTLY minW=0 ws=736 hM=AT_MOST minH=0 hs=1006
board: wM=EXACTLY minW=0 ws=736 hM=EXACTLY minH=0 hs=702
I/Choreographer﹕ Skipped 118 frames!  The application may be doing too much work on its main thread.
board: wM=AT_MOST minW=0 ws=736 hM=AT_MOST minH=0 hs=1006
table: wM=EXACTLY minW=0 ws=736 hM=EXACTLY minH=0 hs=1006
table: wM=EXACTLY minW=0 ws=736 hM=AT_MOST minH=0 hs=1006
board: wM=EXACTLY minW=0 ws=736 hM=EXACTLY minH=0 hs=702

共有1个答案

许嘉珍
2023-03-14

试试看:

移动并更改

android:layout_below="@id/board" 

android:layout_above="@id/table" 

在你的另一个布局上。

同时在表布局上设置android:alignParentBottom=true

 类似资料:
  • 我正在尝试使用roughike bottom-bar实现底部导航栏:https://github.com/roughike/bottombar 下面是我(在手机上)得到的图像: 我想让我的工具栏保持在设备屏幕的顶部。当我运行应用程序时,底部栏几乎占据了我mainactivity的所有空间。CoordinatorLayout必须是所有元素的父元素吗?下面是我的XML布局文件:

  • 从图片中可以看到,imageView幻灯片上的空间图片几乎占据了整个屏幕,当我想要它的时候: > 从操作栏下方开始(您可以看到自定义应用程序栏的浅紫色) 占据了这下面所有的空间。如果有人有什么想法,我会非常感激的,谢谢。图片:https://imgur.com/a/fpbcyh9 null

  • 我想在特定的链接中录制我的屏幕视频。我只想在中录制执行的操作。现在,<code>MediaRecorder</code>正在录制整个屏幕,如何录制屏幕的特定部分?

  • 本文向大家介绍Android如何自定义视图属性,包括了Android如何自定义视图属性的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家介绍了Android自定义视图属性的方法,供大家参考,具体内容如下 1. 自定义一个自己的视图类继承自View 2. 在res/values目录中新建一个attrs.xml文件 一个attr属性,对应了一个视图属性 3.最后看布局文件中如何利用我们创建的自定

  • Android在Kitkat和Lollipop上获得了一个新的API,用于视频捕捉屏幕。您可以通过ADB工具或代码(从Lollipop开始)来完成。 自从新的API发布以来,许多应用程序都使用了这一功能,允许录制屏幕,微软甚至还开发了自己的Google Now On tap竞争对手应用程序。 使用ADB,您可以使用: 你甚至可以在Android Studio内部完成这项工作。 我找不到任何关于如何

  • 主要内容:前记,1.自定义视图,2.自定义异常,3.自定义异常的原理前记 在前面的文章中, 表示了视图解析的原理和异常解析器的解析原理。 这篇通过如何自定义视图和自定义异常处理和自定义异常处理的原理进行说明。 这里说明一下, 自定义的视图和自定义的异常都是会代替容器默认的组件的, 异常还好说, 就是不符合就抛, 视图的话需要注意一下优先级, 可以在自定义的视图解析器上加上注解。 1.自定义视图 这里原理就是添加一个视图和视图解析器, 然后放入容器中, 最后访问相应