ScrollView截断了顶部并在底部留下空间

40
当我启动模拟器并进入使用此代码的屏幕时,它显示大部分文本信息,但在屏幕顶部截断(无法向上滚动),但在底部留下了一些空间。
这是代码:
    <ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:visibility="visible"
    android:fillViewport="true"
    android:id="@+id/backgroundImage" >

 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="center"
    android:padding="10dip" >

     <ImageView
        android:id="@+id/earthSymbolImageView"
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:src="@drawable/earthsymbol" />

     <TextView
        android:id="@+id/earth_content1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/earth_title"
        android:gravity="center" 
        android:textColor="#FFFFFF"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/earth_content2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/earth_text" 
        android:textColor="#FFFFFF" />

    <Button
        android:id="@+id/backButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/back" />

     </LinearLayout>
    </ScrollView>

有人知道为什么会发生这种情况吗?


1
如果可能,请上传带有问题的屏幕截图。 - MKJParekh
你尝试过移除这个 android:padding="10dip" 并使用 android:margin="10dip" 来完成这件事吗? - QAMAR
尝试删除您的ScrollView中的android:fillViewport="true"行,然后检查。 - GrIsHu
左边的图片显示屏幕底部,右边的图片显示屏幕顶部。 - Maynn
8个回答

51

这是由于你的LinearLayout中的layout_gravity引起的。由于你的LinearLayout在ScrollView内部,你可能只是想要水平居中(在ScrollView内垂直居中没有意义)。像这样指定你的LinearLayout水平居中就可以解决问题:

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="center_horizontal"
    android:padding="10dip" >

我曾经遇到过同样的问题。我在ScrollView内部的LinearLayout中使用了android:layout_gravity="center_vertical"。 - Vamsi Challa
1
同样的问题。线性布局应该是水平居中而不是垂直居中。谢谢!:D这应该是被接受的答案。 - Jeremy Styers
谢谢,我以为在尝试成千上万个属性组合时会发疯。 - PhilLab
2
为什么在ScrollView中垂直居中没有意义?当我的应用程序处于纵向模式时,一切都很好,一切都可见。我的ScrollView由一个CardView(或FrameLayout等)和登录表单组成。我希望该表单在应用程序处于纵向模式且所有内容都可见时垂直居中。另一方面,当应用程序处于横向模式时,CardView无法适应屏幕大小,因此我希望它可以滚动。 - Maroš Šeleng
android:layout_gravity="center_horizontal" 对我很有效。 - M.A.K. Ripon

26

我曾经遇到过一个与ScrollView嵌套HorizontalScrollView的相同问题。我的HorizontalScrollView重力设置为center,这导致了问题。只需将其移除即可解决问题。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

<HorizontalScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">

    <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        <TextView
                android:layout_width="1000dp"
                android:layout_height="1000dp"
                android:gravity="center"
                android:layout_gravity="center"
                android:text="New Text"/>
    </LinearLayout>
</HorizontalScrollView>

即使您没有使用嵌套的滚动视图,这也是有效的。我在我的滚动视图中有一个线性布局,这对我很有效。 - PFranchise

11

我找到并测试过的最佳解决方案是在此问题中@hadi提供的解答: no gravity for scrollview. how to make content inside scrollview as center

回答如下:

  • 将您的ScrollView放置在RelativeLayout中。
  • 在ScrollView中,设置以下内容:
    • android:layout_height="wrap_content"
    • android:layout_centerVertical="true"
  • 将您的垂直LinearLayout放置在ScrollView中。

代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            ...

        </LinearLayout>
    </ScrollView>
</RelativeLayout>

似乎这种方式没有考虑内部视图的底部边距。但从到目前为止我发现的所有方法中,它是最接近完美的方法。 - Maroš Šeleng
最佳答案 :) 救了我的一天 - B.shruti

3

在横向滚动视图(Horizontalscroll view)中,将线性布局(Linear layout)/相对布局(Relative layout)的layout_gravity属性移除即可。


2
很简单 - 您只需要将 LinearLayout 中的 layout_gravity 移到父容器 ScrollView 中即可:
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:visibility="visible"
    android:fillViewport="true"
    android:id="@+id/backgroundImage" 
    android:layout_gravity="center" >

 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dip" >

0
在我的情况下,问题出在EditTextrequestFocus上。
在你的情况下,没有EditText,所以问题可能是其他的。对于那些遇到滚动视图剪切顶部边缘问题的人,请尝试从所有EditText中删除所有requestFocus

0
你必须在LinearLayout中添加marginBottom。
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" 
android:visibility="visible"
android:fillViewport="true"
android:id="@+id/backgroundImage" >

 <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center"
android:padding="10dip"
android:layout_marginBottom="96dp" >    

 <ImageView
    android:id="@+id/earthSymbolImageView"
    android:layout_width="25dp"
    android:layout_height="25dp"
    android:src="@drawable/earthsymbol" />

 <TextView
    android:id="@+id/earth_content1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/earth_title"
    android:gravity="center" 
    android:textColor="#FFFFFF"
    android:textSize="20sp" />

<TextView
    android:id="@+id/earth_content2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/earth_text" 
    android:textColor="#FFFFFF" />

<Button
    android:id="@+id/backButton"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/back" />

 </LinearLayout>
</ScrollView>

-3
如果您想让TextView可滚动,为什么不在这两个元素周围放置ScrollView呢?
 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="center"
    android:padding="10dip" >


    <ScrollView>
     <ImageView
        android:id="@+id/earthSymbolImageView"
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:src="@drawable/earthsymbol" />

     <TextView
        android:id="@+id/earth_content1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/earth_title"
        android:gravity="center" 
        android:textColor="#FFFFFF"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/earth_content2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/earth_text" 
        android:textColor="#FFFFFF" />

     </ScrollView>

    <Button
        android:id="@+id/backButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/back" />



     </LinearLayout>

我已经解决了这个问题,解决方案是只在TextView周围放置ScrollView。 - Maynn
1
你忘记在ScrollView上添加属性了 - 而且ScrollView不能有超过一个直接子元素。 - Graeme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接