Скрытие панели инструментов с помощью прокрутки с повторным просмотром внутри фрагмента
Я пытаюсь свернуть панель инструментов при прокрутке, когда прокрутка recyclerview внутри фрагмента. Для начала, heres мой основной макет:
<DrawerLayout>
<RelativeLayout
android:id="@+id/mainRelativeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="5dp"
app:layout_scrollFlags="scroll|enterAlways"
>
</Toolbar>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</android.support.design.widget.CoordinatorLayout>
</RelativeLayout>
<!-- ignore -->
<drawercontents>
</DrawerLayout>
Итак, как вы можете догадаться, мои фрагменты загружаются в @id/container
. Мой первый фрагмент содержит recyclerview, и я установил app:layout_behavior="@string/appbar_scrolling_view_behavior"
на этот recyclerview. Это работает, и панель инструментов рушится на прокрутке. Проблема заключается в том, что панель инструментов покрывает верхнее содержимое фрагмента, когда оно не свернуто. Добавление верхнего поля в контейнер фрагмента, равного размеру панели инструментов, просто приводит к тому, что пустое пространство остается слева, когда панель инструментов сворачивается (очевидно).
Что здесь отсутствует? Любые идеи?
РЕДАКТИРОВАТЬ: В соответствии с запросом, вот макет для фрагмента, содержащего recyclerview:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
android:id="@+id/feed"
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:background="#00000000"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
Ответы
Ответ 1
<?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:id="@+id/tabanim_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/tabanim_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
Ответ 2
Сделайте одно имя макета как toolbar.xml и включите его в свой код, где хотите использовать, но напомните одну вещь, пожалуйста, не используйте какой-либо другой формат, например Relativelayout, Linearlayout и другие на
Ответ 3
Вам нужно что-то похожее на приложение для игрового магазина.
Вставка макетов здесь. Код для этого прост, и вы можете его самостоятельно закодировать.
- FrameLayout
- ImageView
- ScrollView
- LinearLayout
- HorizontalScrollView
- ToolBar
С вышеуказанной иерархией раскладки вы можете добиться чего-то вроде этого:
![введите описание изображения здесь]()
Ответ 4
Вы можете использовать сворачивание макета
как
<?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:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapse_toolbar"
android:layout_width="match_parent"
android:layout_height="200dp"
android:fitsSystemWindows="true"
app:contentScrim="@color/zxing_transparent"
android:paddingBottom="2dip"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:expandedTitleGravity="bottom|center_horizontal"
app:expandedTitleMarginBottom="50dip"
app:collapsedTitleGravity="top|center_vertical"
app:collapsedTitleTextAppearance="@style/collapseTitle">
<Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="5dp"
app:layout_scrollFlags="scroll|enterAlways"
>
</Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</android.support.design.widget.CoordinatorLayout>
Ответ 5
Я использовал SwipeRefreshLayout
или просто LinearLayout
или RelativeLayout
как корень макета Fragment
, и он работает.
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_refresh_layout_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/mycustomcolor"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.v4.widget.SwipeRefreshLayout>
С RelativeLayout
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/fragment2"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view_android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</RelativeLayout>
Тогда должно быть хорошо идти.
Ответ 6
Мой друг, я сделал это сегодня и отлично работал, у меня есть 2 фрагмента, у которых RecyclerView
и может прокручиваться Toolbar
. Я посмотрел chrisbanes's
CheeseSquare
: CheeseSquare
Если вы посмотрите на MainActivity
, в TabLayout
есть 3 фрагмента, и все они могут прокручивать Toolbar
. Поэтому я подготовил этот макет, возможно, вы посмотрите на:
my activity_home.xml
:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<include layout="@layout/content_home"/>
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:layout_gravity="start"
app:menu="@menu/homepage_leftdrawer">
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
И content_home.xml
:
<?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:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme3.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways|snap" />
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabTextColor="@color/Transparent_few_white"
app:tabIndicatorColor="@color/White"
app:tabTextAppearance="@style/TabLayoutTextStyle"
app:tabIndicatorHeight="3dp"
app:tabSelectedTextColor="@color/White"
android:background="@color/ColorPrimary"
app:tabPaddingStart="0dp"
app:tabPaddingEnd="0dp"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/pager2"
android:layout_height="match_parent"
android:layout_width="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>
Где ключ здесь:
Если вы посмотрите на мой ViewPager
, у него есть атрибут app:layout_behavior="@string/appbar_scrolling_view_behavior"
Тогда вот оно. Не добавляйте другое поведение в фрагмент. Просто попробуйте это и придите с результатом, пожалуйста!
Ответ 7
Не тестировали это еще, но это то, что вы должны сделать:
- Переместите
app:layout_behavior="@string/appbar_scrolling_view_behavior"
в FrameLayout
с id container
.
- Добавьте
android:fitsSystemWindows = "true"
к вашему AppBarLayout
.
Это именно то, что я делаю в своем приложении, и это работает. Если это не сработает для вас, попробуйте очистить (в Android Studio, Сборка → Очистить проект) свой проект и снова запустить приложение.
Ответ 8
Вы можете исправить это, добавив третий флаг - snap
, в свойство layout_scrollFlags
.
<Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="5dp"
app:layout_scrollFlags="scroll|enterAlways|snap" />
Использование этой опции определит, что делать, если представление только частично уменьшено. Если прокрутка заканчивается, а размер представления уменьшен до менее 50% от его оригинала, тогда это представление вернется к исходному размеру. Если размер превышает 50% его размера, он полностью исчезнет.
проверьте эту ссылку .
Ответ 9
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentScrim="?attr/colorPrimary"
>
<android.support.v7.widget.Toolbar
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_below="@+id/app_bar_layout"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:weightSum="1">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Your recycler view should go here"/>
</FrameLayout>
</LinearLayout>
![введите описание изображения здесь]()
Ответ 10
Также столкнулся с этой проблемой. Но решение было найдено. Решение с переработкой xml не может быть, поэтому вам нужно делать это программно. Все, что нам нужно, это Inflater. Да, да, это так просто. На лету измените xml, чтобы прокрутить всю прокрутку.
Ответ 11
в вашем наборе фреймов >
android:layout_below="@+id/appBarLayout"
если это не работает, попробуйте следующее:
android:layout_below="@+id/toolbar"