Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由其父视图剪裁的Android视图的完整大小_Android_Layout_View_Size_Android Linearlayout - Fatal编程技术网

由其父视图剪裁的Android视图的完整大小

由其父视图剪裁的Android视图的完整大小,android,layout,view,size,android-linearlayout,Android,Layout,View,Size,Android Linearlayout,请看一下这个xml布局 <LinearLayout android:id="@+id/dataTableContainer" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" andro

请看一下这个xml布局

    <LinearLayout android:id="@+id/dataTableContainer"
                  android:orientation="vertical"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:clipChildren="true">

        <LinearLayout android:id="@+id/dataTable"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:orientation="vertical"/>  

    </LinearLayout>

在运行时,“dataTable”元素填充的子元素比“dataTableContainer”可以显示的要宽。然而,当我在eclipse中检查这两个元素的mMeasuredWidth(甚至是getWidth()的返回值)时,发现它们完全相同。不应该是这样。我的理解是,“dataTable”的子级应该根据其“wrap_content”设置将其推到自己的宽度。相反,“dataTableContainer”应小于该值,因为其“fill_parent”设置受屏幕大小的限制

我还尝试将“clipChildren”设置为false,以防宽度被容器剪裁,但结果保持不变:表和容器都具有相同的宽度

有人能解释发生了什么事吗


为了给您提供一些上下文,我试图做的是收集这些元素的大小,以确定有多少“dataTable”元素位于容器外部,因此不可见。这反过来又需要限制用户可以拖动table元素的距离。ScrollView元素本机限制了运动,但由于我使用的是线性布局,我需要复制这种限制功能。

似乎我太信任Eclipse了。在使用断点检查应用程序的状态和许多可用变量的值进行调试时,我依赖eclipse提供的变量列表,其中包括mMeasuredWidth/mMeasuredHeight。请注意,这些不是源代码中的变量。Eclipse不知怎的自己找到了它们,帮我检查了这些对象。因此,我认为它们确实代表了测量的宽度/高度。然而,我的假设是错误的,如果只是因为一个视图可以用不同的方式进行度量(即使用MeasureSpec.UNSPECIFIED或MeasureSpec.quickly),而eclipse不知道我需要哪种度量

因此,我通过在代码中添加以下内容触发了所需的测量:

int measureSpecParams = View.MeasureSpec.getSize(View.MeasureSpec.UNSPECIFIED);
dataTableView.measure(measureSpecParams, measureSpecParams);
int measuredWidth = dataTableView.getMeasuredWidth();
int measuredHeight = dataTableView.getMeasuredHeight();

这确实给了我想要的视图大小,即如果父视图或屏幕限制了“dataTable”视图的大小。

内部
线性布局不能大于外部布局,因此宽度相等似乎是合理的。是否确实需要根元素成为
线性布局
?能否将
dataTableContainer
包装在
ScrollView
中?谢谢@acj的评论。我认为假设内部元素不能大于外部元素是不安全的。当然在视觉上它不能,但在内部我认为渲染引擎知道(并存储在某处)内部元素希望更大,但被外部元素剪裁。因此,我希望测量的宽度与getWidth()返回的值之间存在差异。为了回答您的问题@acj,我无法使用ScrollView,因为我正在尝试创建一个简单的二维ScrollView,它可以水平和垂直滚动。我已经看到了解决这个问题的方法,但对于我需要做的事情来说,它们似乎有点过头了。拖动内部元素已经起作用了,但我不知道如何限制它的运动,使它不会离开屏幕!其中提到“[a]视图的测量宽度和测量高度值必须遵守视图父视图施加的约束”。在测量通过后,视图所需的宽度/高度似乎被丢弃。除了填充
dataTable
,您是否以编程方式更改内部布局的大小或行为?我的理解是,除非您另行指定,否则父视图会对其子视图施加度量约束,这正是您的方法所做的。我认为Eclipse正在跟踪本地测量过程中的测量变量。很高兴听到你找到了一个可行的解决办法。