我正在尝试使用线性布局的layout_weight作为scrollview内部的高度。但是我发现layout_weight只适用于fillViewPort = true,并且如果有足够的剩余空间可以展开linear_weight。
我在下面列出了三个示例,我希望将#View和#3中的textView设置为xml级别的#1。 正如您在链接中看到的那样,在#2,#3中,textView自动更改。
以下是我的例子。 TextViews和Buttons包含在LinearLayout内部,然后包含在scrollView中。
这是我的#3的xml代码。 #2和#1基本上是相同的代码,没有或没有按钮。
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/scroller"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:weighSum="1"
android:fillViewport="true" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:weightSum="10" >
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<Button
android:layout_width="30dip"
android:layout_height="30dip"
android:text="Accept" />
<TextView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="6"
android:background="#AAABBB"
android:text="hello" />
<TextView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:background="#BBBAAA"
android:text="hello" />
<TextView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="5"
android:background="#AAABBB"
android:text="hello" />
</LinearLayout>
</ScrollView>
答案 0 :(得分:2)
这些图像正是我期望为你的xml看到的。
这可能会对您有所帮助:
当系统布局时使用权重方法将View
放在屏幕上,它只根据权重分配备用空间,而不是总空间。因此,为了使其分配根据权重分配的总空间(这是大多数人直观期望的),您必须将您希望它工作的维度设置为0dip。因此,对于那些Button
和TextView
,您需要设置
android:layout_height = "0dip"
您可能还需要强制ScrollView
填充视口以阻止所有内容进行整理。见here
android:fillViewport="true"
个人观察。有时权重似乎是反向的(即较小的权重会产生更多的空间)。 YMMV。
答案 1 :(得分:2)
重量按设计工作。也许不是你希望他们“工作”的方式,但说他们“不工作”是不准确的。考虑一下你的第三种情况,你期望TextViews的像素大小是多少?权重是可用空间的百分比(不是父项的总大小)。 scrollview和linearlayout至少是屏幕的大小,否则是所有子视图的总和。因此,如果您的孩子视图超出了屏幕的大小(没有权重的视图),您希望为剩余视图(具有0dp和权重的视图)分配多少空间?关键是空间量是任意的,android不会尝试假设你想要多少空间,因为它没有可能的知道方式。
TL; DR - 在文本视图上设置minHeight(以dp为单位),以处理按钮太多的情况。
答案 2 :(得分:1)
尝试在具有layout_weight的元素上设置layout_height =“0dp”。封闭的布局对象将使用任何可用空间来尽可能多地增长它们。
你对weightSum的使用也有点疑问。通常,weightSum应该> =所包含视图的总权重。你有一个weightSum,其中没有直接封闭的视图有权重,另一个是封闭视图的总重量超过weightSum。第二种情况会导致奇怪的行为。