ViewPager в NestedScrollView
Мне нужно создать такой интерфейс, как Google Newsstand, который является своего рода ViewPager (горизонтальная прокрутка) над сворачивающимся заголовком (вертикальная прокрутка). Одним из моих требований является использование новой библиотеки поддержки дизайна, представленной в Google IO 2015.
(http://android-developers.blogspot.ca/2015/05/android-design-support-library.html)
Основываясь на примере, созданном Крисом Банесом (https://github.com/chrisbanes/cheesesquare), я дошел до того, что могу выполнить рушительное поведение, но с базовым LinearLayout (без горизонтальной прокрутки).
Я попытался заменить LinearLayout на ViewPager, и я получил пустой экран. Я играл с: шириной, весом и всеми видами групп представлений, но... все еще пустой экран. Кажется, что ViewPager и NestedScrollView не любят друг друга.
Я попробовал обходной путь с помощью HorizontalScrollView: он работает, но я теряю преимущество функции PagerTitleStrip и фокусируюсь на одной панели (я могу остановить горизонтально между 2 панелями).
Теперь у меня больше нет идей, если кто-нибудь может привести меня к решению...
Спасибо
Вот мой последний файл макета:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="@dimen/header_height"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<include
layout="@layout/part_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_collapseMode="parallax"/>
<android.support.v7.widget.Toolbar
android:id="@+id/activity_main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/activity_main_nestedscrollview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v4.view.ViewPager
android:id="@+id/activity_main_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFA0"/>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
Ответы
Ответ 1
Я встречаю эту проблему, я решаю ее setFillViewport (true)
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/nest_scrollview"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="mio.kon.yyb.nestedscrollviewbug.ScrollingActivity"
tools:showIn="@layout/activity_scrolling">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
в действии
NestedScrollView scrollView = (NestedScrollView) findViewById (R.id.nest_scrollview);
scrollView.setFillViewport (true);
![введите описание изображения здесь]()
Ответ 2
Хорошо, я сделал небольшую демонстрацию с ViewPager
и NestedScrollView
. Проблема, с которой я столкнулся, заключалась в высоте ViewPager
и ListView
. Поэтому я сделал небольшую модификацию при измерении высоты ListView
и ViewPager's
.
Если кто-то захочет заглянуть в код, вот ссылка: https://github.com/TheLittleNaruto/SupportDesignExample/
Вывод:
![введите описание изображения здесь]()
Ответ 3
Добавьте android:fillViewport="true"
в NestedScrollView
. период.
Ответ 4
Были те же проблемы.
При размещении NestedScrollView вокруг ViewPager это не сработает.
Что DID работает, но помещает NestedScrollView внутри макет фрагмента, который я загружаю внутри ViewPager.
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@id/fragment_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_vertical"
android:orientation="vertical">
...Content...
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
код >
Ответ 5
Вместо размещения ViewPager внутри NestedScrollView, сделайте это наоборот.
Поместите NestedScrollView в дочерние представления внутри ViewPager, который по сути является макетом фрагмента. Также очень вероятно, что вам даже не понадобится использовать NestedScrollView, если макет списка фрагментов очень прост.
Примеры макетов
Макет действий:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/app_bar_height"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/app_bar_height"
android:scaleType="centerCrop"
android:src="@drawable/my_bg"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.8"
app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.design.widget.TabLayout
android:id="@+id/content_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
Если вам не нужен TabLayout, вы можете вырезать LinearLayout и сделать ViewPager автономным. Но обязательно используйте app:layout_behavior="@string/appbar_scrolling_view_behavior"
в атрибутах ViewPager.
Макет простого фрагмента:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Макет сложного фрагмента:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:fillViewport="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World"/>
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>
Пример приложения: CollapsingToolbarPoc
![введите описание изображения здесь]()
Ответ 6
вы можете попробовать это, viewpager отлично работает, но высота viewpager исправлена.
Я все еще нахожу лучшее решение..., поэтому, пожалуйста, дайте мне знать, что любой момент может сделать это лучше, спасибо
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="800dp"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
Ответ 7
У меня была такая же проблема, и я просто исправил ее с некоторыми изменениями. ViewPager
не работает в пределах NestedScrollView
. Просто поставьте ViewPager
в качестве прямого дочернего элемента вашего CoordinatorLayout
. Затем контент для каждого фрагмента ViewPager должен быть заключен в NestedScrollView
.. Это он.
Ответ 8
Вам не нужно использовать NestedScrollView для получения эффектов параллакса.
попробуйте что-то вроде этого:
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true">
<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|enterAlways"/>
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_tab_layout"
android:fillViewport="false"
app:tabMode="fixed"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/my_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>
Ответ 9
Я удалил NestedScrollView из основного макета и вставил в качестве родителя во все мои макеты Фрагмент, которые должны были загружаться в ViewPager, исправлено это вопрос для меня.
Ответ 10
Для решения вашей проблемы используйте подгоняемый класс. Не забудьте вызвать метод onRefresh() на странице changelistener.
public class ContentWrappingViewPager extends ViewPager
{
private int width = 0;
public ContentWrappingViewPager(Context context) {
super(context);
}
public ContentWrappingViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int height = 0;
width = widthMeasureSpec;
if (getChildCount() > getCurrentItem()) {
View child = getChildAt(getCurrentItem());
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
if(h > height) height = h;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void onRefresh()
{
try {
int height = 0;
if (getChildCount() > getCurrentItem()) {
View child = getChildAt(getCurrentItem());
child.measure(width, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
if(h > height) height = h;
}
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
layoutParams.height = heightMeasureSpec;
this.setLayoutParams(layoutParams);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ответ 11
Следующее должно обеспечить правильную высоту пейджера представления. Фрагмент - это первый фрагмент, предоставленный пейджером представления.
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<fragment
class="com.mydomain.MyViewPagerFragment"
android:id="@+id/myFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
Ответ 12
У меня была аналогичная проблема (но без CollapsingToolbarLayout
, просто Toolbar
+ TabLayout
в AppBarLayout
). Я хотел, чтобы панель инструментов прокручивалась из поля зрения при прокрутке содержимого ViewPager
в пределах NestedScrollView
.
В моем макете было что-то вроде этого:
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true">
<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|enterAlways"/>
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_tab_layout"
android:fillViewport="false"
app:tabMode="fixed"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_gravity="fill_vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v4.view.ViewPager
android:id="@+id/my_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v4.view.ViewPager>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
Этот макет не работал должным образом, но я решил его просто избавиться от NestedScrollView
и вместо этого использовать LinearLayout
. Он сразу работал у меня в Android Support Library v23.1.0. Вот как закончилось оформление:
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true">
<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|enterAlways"/>
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_tab_layout"
android:fillViewport="false"
app:tabMode="fixed"/>
</android.support.design.widget.AppBarLayout>
<LinearLayout
android:orientation="vertical"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="4dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v4.view.ViewPager
android:id="@+id/my_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v4.view.ViewPager>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
PS: На самом деле это были два файла макета в моем проекте. Я скопировал и вставил их здесь и попытался структурировать их, как это было бы в одном файле. Прошу прощения, если я напортачил при копировании, но, пожалуйста, дайте мне знать, если это так, я могу это исправить.
Ответ 13
У меня был макет с панелью инструментов приложения с NestedScrollView под ним, затем внутри вложенной панели инструментов был LinearLayout, ниже LinearLayout был пейджер представления. Идея заключалась в том, что LinearLayout внутри NestedScrollView был исправлен - вы могли скользить влево/вправо между представлениями пейджера представления, но этот контент не перемещался, по крайней мере, по горизонтали. Вы все равно можете прокручивать все содержимое по вертикали из-за вложенного представления прокрутки. Это была идея. Поэтому я установил вложенную высоту NestedScrollView в match_parent, запустил viewport, затем все дочерние макеты /ViewPager для wrap_content.
В моей голове это было правильно. Но это не сработало - ViewPager разрешил мне идти влево/вправо, но нет вертикальной прокрутки, будь то содержание страницы в представлении, подтолкнутое ниже нижней части текущего экрана или нет. Оказывается, это было в основном потому, что ViewPager не рассматривает wrap_content на разных страницах.
Я обошел это, подклассифицировав ViewPager, чтобы он менял высоту в зависимости от текущего выбранного элемента, и это заставляло его вести себя как layout_height = "wrap_content":
public class ContentWrappingViewPager extends ViewPager {
public ContentWrappingViewPager(Context context) {
super(context);
}
public ContentWrappingViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = 0;
if (getChildCount() > getCurrentItem()) {
View child = getChildAt(getCurrentItem());
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
if(h > height) height = h;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
Решение было вдохновлено этим ответом. Работал для меня!
Ответ 14
У меня такое же желание, гнездо a ViewPager
внутри a NestedScrollView
. Но для меня это тоже не работает. В моем случае ViewPager
находится внутри Fragment
, поэтому я могу переключать контент в зависимости от взаимодействия с ящиком. Конечно, AppBar, коллапс и т.д. И все новые функции библиотеки поддержки должны работать.
Если пользователь вертикально прокручивает страницу в пейджере, я хочу, чтобы другие страницы были прокручены одинаково, чтобы дать пользователю общее впечатление о том, что сам пейджер прокручивается.
Что я делал, что работает, так это то, что я больше не вставляю ViewPager
внутри a NestedScrollView
, вместо этого вставляю содержимое содержащихся фрагментов внутри NestedScrollView
.
Затем, в случае прокрутки в одном фрагменте, я информирую контейнер о новой позиции прокрутки, которая хранит его.
Наконец, при прокрутке влево или вправо, обнаруженном на пейджере (используя addOnPageChangeListener
для поиска состояний перетаскивания), я информирую целевой левый или правый фрагмент, где он должен прокручивать (на основе знания контейнера), который должен быть выровнен из фрагмент, из которого я пришел.
Ответ 15
Я знаю одно рабочее решение: вы используете Activity, с CoordinatorLayout и используете FrameLayout, контейнер. Затем. используйте менеджер фрагментов для размещения фрагмента в контейнере. Например, мой код:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
app:layout_scrollFlags="scroll|enterAlways"
android:layout_height="@dimen/toolbar_height"
android:background="?attr/colorPrimary"
android:gravity="center">
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</FrameLayout>
И фрагмент:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.improvemdia.inmyroom.MainFragment">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Затем используйте FragmentManager
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, new MainFragment())
.commit();
Ответ 16
Проведя часы, пробовал все вышеперечисленные предложения, наконец, я заработал. Ключ заключается в помещении NestedScrollView
внутри PageViewer
, и установите layout_behavior
в '@string/appbar_scrolling_view_behavior'
для BOTH. Окончательный макет похож на
<CoordinatorLayout>
<ViewPager app:layout_behavior="@string/appbar_scrolling_view_behavior">
<NestedScrollView fillViewport="true" app:layout_behavior="@string/appbar_scrolling_view_behavior">
<Content>...</Content>
</NestedScrollView>
</ViewPager>
<AppBarLayout>...</AppBarLayout>
</CoordinatorLayout>
Ответ 17
вы просто удалили NestedScrollView на свой xml и добавили этот код в свой класс
yourGridView.setNestedScrollingEnabled(true);
Ответ 18
На самом деле, NestedScrollView не должен быть прямым родственником CollapsingToolbarLayout в CoordinatorLayout. Я достиг чего-то реального bizzare. Приложение appbar_scrolling_view_behavior работает с двумя вложенными фрагментами.
Мой макет деятельности:
<android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.AppBarLayout>
<android.support.design.widget.CollapsingToolbarLayout>
<include
layout="@layout/toolbar"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/container"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>
В "контейнере" frameLayout я раздул этот фрагмент:
<android.support.constraint.ConstraintLayout>
... some content ...
<android.support.v4.view.ViewPager/>
...
</android.support.constraint.ConstraintLayout>
И фрагменты внутри этого ViewPager выглядят следующим образом:
<RelativeLayout>
<android.support.v7.widget.RecyclerView/>
....
</RelativeLayout>
Факт, что NestedScrollView может быть настолько глубоким в иерархии дочерних элементов CoordinatorLayout и поведения поведения прокрутки, что работы действительно меня удивили.
Ответ 19
просто поместите эту строку в NestedScrollView
android:fillViewport="true"