Вы можете достичь этого, комбинируя ScrollView
, используя android:fillViewport="true"
и вертикальную LinearLayout
, которая имеет Space
с android:layout_weight="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:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="#ccc"/>
<Space
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<View
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#eee"/>
</LinearLayout>
</ScrollView>
Это первое представление является заполнителем для любого содержимого, которое вы хотите отобразить, а второе - заполнителем для вашей панели навигации. Вы можете видеть, что когда первое представление короткое (высотой 200 dp), вы получаете «контент» вверху и панель навигации внизу:
Это работает, потому что атрибут fillViewport
будет "растягивать" дочерний элемент LinearLayout
для заполнения экрана, после чего появляется "дополнительное" пространство, а атрибут layout_weight
в элементе Space
будетпотреблять все это пространство. (Обратите внимание, что, несмотря на то, что ScrollView
, вы не можете прокручивать что-либо в этом состоянии, так как представление растянуто до точного размера экрана.)
Однако, когда «содержимое»достаточно высокий, чтобы заполнить экран, атрибут fillViewport
не будет иметь никакого эффекта, LinearLayout не будет растянут, и не будет никакого дополнительного места для потребления. Поэтому, как только вы прокрутите страницу вниз, ваш контент заполнится до самого края панели навигации:
(Прокрутка вверху слева и прокрутка внизу справа.)