Centering a View within a ScrollView

March 14, 2012 Aaron VonderHaar

We have a View that we want centered on the screen, but that must scroll when there isn’t enough room to show the view fully (for example, when the keyboard is up).

Our first attempt:

<ScrollView
    android:layout_width=...
    android:layout_width=...
    >
    <View
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />
</ScrollView>

Unfortunately there is a bug in Android where setting layout_gravity=”center” on a ScrollView’s child causes incorrect scrolling when you start hiding and showing other views in the layout (the ScrollView will get stuck with an offset such that you can’t completely scroll to the top, and you can scroll past the bottom).

Here’s the solution:

<ScrollView
    android:layout_width=...
    android:layout_width=...
    android:fillViewport="true"
    >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        />
        <View
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            />
        <View
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            />
        <View
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            />
    </LinearLayout>
</ScrollView>

The wrap_content in the LinearLayout is a bit misleading: fillViewport=”true” in the ScrollView will cause its child to always be at least as large as the viewport. (See also Romain Guy’s article about fillViewport.)

About the Author

Biography

More Content by Aaron VonderHaar
Previous
Using Cloud Foundry Services with Ruby: Part 2 – Run-time Support for Ruby Applications
Using Cloud Foundry Services with Ruby: Part 2 – Run-time Support for Ruby Applications

The services offered in Cloud Foundry are necessary for writing any serious application. Our aim is to make...

Next
TeamCity is pretty cool, you should totally check it out
TeamCity is pretty cool, you should totally check it out

At Pivotal, our default choice for CI is Jenkins. I feel that Jenkins does a fine job running builds and re...

How do you measure digital transformation?

Take the Benchmark