Android Nested Scrollview не прокручивается

У меня есть вложенный ScrollView, который содержит содержимое внутри линейного макета.

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:CoverFlowPager="http://schemas.android.com/apk/res-auto"
    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.support.v4.widget.NestedScrollView
        android:id="@+id/scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:clipToPadding="false"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

    </android.support.v4.widget.NestedScrollView>

</FrameLayout>

У меня есть этот макет внутри ViewPager, а ViewPager находится внутри CordinatorLayout.

<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:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

Теперь, когда я прокручиваю представление, представление не прокручивается. Но поскольку макет помещается внутри макета координатора, он перемещается вверх до тех пор, пока панель инструментов не будет скрыта. Но он не прокручивается вверх.

Вот моя основная деятельность xml. Пейджер просмотра находится внутри макета с вкладками.

<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:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

           <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:attrs="http://schemas.android.com/apk/res-auto"
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/AppTheme.PopupOverlay">

            <FrameLayout
                android:id="@+id/titleContainer"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"    
                android:gravity="center">

                <com.CustomFontTextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:text="Toolbar Title"
                    android:textColor="#ffffff"
                    attrs:customFont="handyman_bold"
                    android:textSize="8pt"
                    android:layout_marginLeft="-20dp"
                    android:id="@+id/toolbar_title"/>
            </FrameLayout>

            <ImageButton
                android:id="@+id/btn_ToolBarRightBtn"
                android:layout_width="32dp"
                android:layout_height="28dp"
                android:tag="0"
                android:background="@null"
                android:scaleType="fitXY"
                android:src="@drawable/icon_shopping"
                android:layout_alignParentRight="true"
                android:layout_gravity="right"
                android:layout_marginRight="10dp"
                />   

        </android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_gravity="bottom"
        android:background="@color/offwhite"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</android.support.design.widget.CoordinatorLayout>

Вот мои скриншоты,

Начальный вид введите здесь описание изображения

Когда представление прокручивается вверх, оно прокручивается только для того, чтобы скрыть верхнюю панель навигации. Не прокручивается для отображения элементов под панелью вкладок,

введите описание изображения здесь


person Zach    schedule 20.05.2016    source источник
comment
разве android:layout_height="match_parent" в представлении NestedScrool не должно быть android:layout_height="wrap_content" ... и в вашем вложенном линейном макете тоже?   -  person longi    schedule 23.05.2016
comment
Можете ли вы добавить изображение того, чего вы пытаетесь достичь?   -  person jobbert    schedule 24.05.2016
comment
пожалуйста, посмотрите скриншоты   -  person Zach    schedule 25.05.2016


Ответы (6)


app:layout_behavior="..." должен быть установлен в прямом дочернем элементе CoordinatorLayout. Если ваш ViewPager является прямым потомком CoordinatorLayout, поместите его в объявление ViewPager.

person Artem Ufimtcev    schedule 23.05.2016

Цитата отсюда: Устранение неполадок макетов координатора

При координации между фрагментом со списком элементов внутри ViewPager и родительской активностью вы хотите поместить свойство app:layout_behavior в ViewPager как здесь, поэтому прокрутки внутри пейджера всплывают и могут управляться CoordinatorLayout. Обратите внимание, что вы не должны размещать это свойство app:layout_behavior где-либо внутри фрагмента или списка внутри.

person Adam Kimi    schedule 24.05.2016

Вы можете попробовать это! У меня была такая же проблема с моим приложением. Это сработало для меня.

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">


    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:attrs="http://schemas.android.com/apk/res-auto"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay">

        <FrameLayout
            android:id="@+id/titleContainer"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"

            android:gravity="center">

            <com.CustomFontTextView
                android:id="@+id/toolbar_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="-20dp"
                android:gravity="center"
                android:text="Toolbar Title"
                android:textColor="#ffffff"
                android:textSize="8pt"
                attrs:customFont="handyman_bold" />
        </FrameLayout>

        <ImageButton
            android:id="@+id/btn_ToolBarRightBtn"
            android:layout_width="32dp"
            android:layout_height="28dp"
            android:layout_alignParentRight="true"
            android:layout_gravity="right"
            android:layout_marginRight="10dp"
            android:background="@null"
            android:scaleType="fitXY"
            android:src="@drawable/icon_shopping"
            android:tag="0" />


    </android.support.v7.widget.Toolbar>

</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/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="@color/offwhite" />


    <android.support.v4.view.ViewPager
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</LinearLayout>

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

<android.support.v4.widget.NestedScrollView
    android:id="@+id/scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="10dp"
    android:clipToPadding="false"
    android:fillViewport="true">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"></LinearLayout>
</android.support.v4.widget.NestedScrollView>

person tintin21    schedule 25.05.2016

попробуй это

scroll.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.getParent().requestDisallowInterceptTouchEvent(true);
        return false;
    }
});
person Pratik    schedule 30.05.2016

ScrollingViewBehavior просто добавляется верхнее и нижнее смещение к вашему ViewPager. Обычно смещение зависит от высоты AppBarLayout и не зависит от высоты TabLayout, потому что оно не находится в AppBarLayout. Итак, для быстрого обходного пути вы можете просто добавить paddingBottom в свой ViewPager следующим образом:

<android.support.v4.view.ViewPager
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="50dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_gravity="bottom"
        android:background="@android:color/black"
        android:layout_width="match_parent"
        android:layout_height="50dp"/>
person Zellius    schedule 30.05.2016

Итак, вот проблема: у вас не может быть NestedScrollView внутри FrameLayout.

Кроме того, некоторые другие небольшие изменения, необходимые в xml, чтобы заставить его работать. Например, TabLayout должен находиться внутри макета AppBar и быть закрепленным.

Вот ваш код -->

</android.support.v7.widget.Toolbar>

<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_gravity="bottom"
android:background="@color/offwhite"
android:layout_width="match_parent"
app:layout_collapseMode="pin"
app:layout_anchor="@+id/appbar"
app:layout_anchorGravity="bottom"
android:layout_height="wrap_content"/>

</android.support.design.widget.AppBarLayout>


<android.support.v4.view.ViewPager
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

И --> Измените код фрагмента, чтобы удалить макет кадра!

    <android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:CoverFlowPager="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:clipToPadding="false"
        android:fillViewport="true">

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

    </android.support.v4.widget.NestedScrollView>

Надеюсь это поможет!

person Anant Shah    schedule 28.05.2016