我的布局包含ScrollView
及其LinearLayout
及其子级:PercentRelativeLayout
23.2.1,另一个LinearLayout
以及另一个PercentRelativeLayout
} 之后。在中间LinearLayout
中,我有一个RecyclerView
(LinearLayoutManager
,垂直)。您可以在下面看到一个示例。
在运行时,当我用RecyclerView
填充数据时,它的大小会增加,因为我从一个空数据开始。一旦其高度变化超过屏幕尺寸,汽车的上方图像(id = car),其百分比值作为其高度,将完全从屏幕上消失。当我上下滚动此屏幕时,我到达顶部和底部边缘并且看不到图像。
我在此布局中的另一个位置也有百分比值,它们定义marginTop
。这些边缘也消失了。与宽度相关的百分比值工作正常。 java代码不包含图像的可见性更改,也不会调整边距。
我目前还不确定这个问题是否与支持库的特定版本有关,我在发布此库的同时构建了此屏幕。另外,我没有在Marshmallow上看到这个问题,只在Lollipop及以下。对于如何解决这个问题,我将不胜感激。
<!-- a container for all views that should scroll -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- the first block of views - they need percents -->
<android.support.percent.PercentRelativeLayout
android:id="@+id/carHolder"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/car"
android:layout_width="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:src="@drawable/car"
app:layout_heightPercenet="25%"/>
<ImageView
android:id="@+id/sliderBg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/car"
android:layout_centerHorizontal="true"
android:src="@drawable/slider_bg"/>
</android.support.percent.PercentRelativeLayout>
<!-- a middle block of views, they don't need percents -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<!-- another block of views, they need percents -->
<android.support.percent.PercentRelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- some other views -->
</android.support.percent.PercentRelativeLayout>
</LinearLayout>
更新
我在支持库23.3.0中也看到了这个问题,不仅在我填充RecyclerView
时,而且每次ScrollView
都超过了屏幕高度。
答案 0 :(得分:2)
不幸的是,百分比布局在M之前不适用于ScrollView。原因在于它们取决于在测量步骤中传递的大小提示。在M之前,大多数布局在发送未指定的测量规范时会提供大小提示0。
您可以尝试通过创建自己的ScrollView子类并重写measureChild和measureChildWithMargins(幸运的是两者都受到保护)来修复它,以提供大小提示。 source- plus.google.com
您可以使用此CustomScrollView使percentRelativeLayout正常工作
FileNotFoundException
答案 1 :(得分:1)
layout_aspectRatio
参数在这里工作正常,因为我也知道视图的宽度,我可以通过使用此参数和基于百分比的宽度来达到首选高度。使用此解决方案,高度将取决于屏幕的宽度,这可能是不同尺寸的问题。
<ImageView
android:id="@+id/car"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:src="@drawable/car"
app:layout_aspectRatio="175%"
app:layout_widthPercent="70%"/>
我将此答案标记为时间解决方案,并接受任何其他有助于以正确方式解决问题的答案。
答案 2 :(得分:0)
虽然这不是关于如何使用PercentRelativeLayout
来解决问题的答案,但这是如何在布局中使用百分比的示例,以防您正在寻找的所有内容。
<!-- a container for all views that should scroll -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- the first block of views - they need percents -->
<LinearLayout
android:id="@+id/carHolder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:weightSum="1">
<ImageView
android:id="@+id/car"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="0.25"
android:layout_gravity="center_horizontal"
android:src="@drawable/car" />
<ImageView
android:id="@+id/sliderBg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/slider_bg"/>
</LinearLayout>
<!-- a middle block of views, they don't need percents -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<!-- another block of views, they need percents -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:weightSum="1">
<!-- some other views -->
</LinearLayout>
</LinearLayout>
这也是一个很好的explanation!