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

Nudelsuppe

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

第二个视图是其子类[TableLayout][1],包含数个Buttons。行数/列数在运行时确定。

为了便于说明,我将称为第一个视图和第二个

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

我试图用一个[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的建议后,我在boardtableonMeasure方法中记录了一些数据

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是的宽度模式MeasureSpec,minW是getSuggestedMinimumWidth(),ws是的宽度尺寸MeasureSpec同样适用于hM,minH和hs。

没有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

试试这个:

移动并更改

android:layout_below="@id/board" 

android:layout_above="@id/table" 

在您的其他布局上。

结合设置android:alignParentBottom=true表格布局来执行此操作

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的自定义视图试图占用 VStack 中所有可用的垂直空间?

Android Lollipop,AppCompat ActionBar自定义视图不会占用整个屏幕宽度

自定义滑块占用太多空间

自定义适配器的Textviews不占用屏幕中的指定空间

在gnome中使用Chrome仅占用可用空间?

Android:如何创建自定义视图

如何在Flutter Android中将自定义视图设置为实际启动屏幕

让图像仅占用剩余空间

如何自定义视图Android SDK,日历视图

Android:如何自定义文本视图或列表视图

Qt如何将自定义小部件添加到垂直布局以占用最少的垂直空间(自定义小部件之间没有空间)

Android:如何从自定义视图的超类获取属性

如何为自定义Android视图实现提取文本

如何在Android中单击创建自定义视图

Android Studio如何使自定义视图可滚动?

如何为Android自定义视图添加OnClick事件

如何在Android中使自定义视图透明

如何在Android中实现自定义堆栈视图?

如何制作与RecyclerView兼容的Android自定义视图

Android-如何布局和使用自定义视图?

如何从自定义视图android获取坐标

如何在android中创建自定义视图

Android如何才能以编程方式向自定义视图分配自定义参数?

如何将网页不可用页面替换为自定义页面?(网络视图)

自定义android视图的“自定义类型”属性

使表格中的图像仅占用所需的空间

Android:clipChildren导致自定义视图的背景绘制整个屏幕高度

D驱动器上几乎没有可用空间,但是文件/文件夹仅占用很少的空间

如何在自定义视图中切掉未使用的空间?