web-dev-qa-db-ja.com

NestedScrollViewおよびCoordinatorLayout。スクロールの問題

CoordinatorLayoutおよびNestedScrollViewに奇妙な問題があります(設計サポートライブラリ22.2.0を使用)

NestedScrollViewより小さいコンテンツを使用する固定コンテンツが必要です。しかし、コンテンツを上下にスクロールしようとすると、コンテンツが移動し、自分の場所に再び移動することはありません。

ここに小さなサンプル:enter image description here

ここにコード:

<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/main_content"
    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/ThemeOverlay.AppCompat.Dark.ActionBar">

            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="?attr/actionBarSize"
                Android:background="?attr/colorPrimary"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:layout_scrollFlags="scroll|enterAlways" />

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

    <Android.support.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <FrameLayout
            Android:paddingTop="24dp"
            Android:id="@+id/fragment_container"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:padding="@dimen/padding">

        </FrameLayout>

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

    <Android.support.design.widget.FloatingActionButton
        Android:id="@+id/fab_action"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="end|bottom"
        Android:layout_margin="16dp"
        Android:visibility="gone"
        Android:src="@drawable/ic_done" />

</Android.support.design.widget.CoordinatorLayout>
34

これは、詳細フラグメント内の1枚を除くすべてのカードを削除する際の cheesesquare デモでも確認できます。

このクラスを使用して(今のところ)これを解決できました: https://Gist.github.com/EmmanuelVinas/c598292f43713c75d18e

<Android.support.v4.widget.NestedScrollView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    app:layout_behavior="com.evs.demo.layout.FixedScrollingViewBehavior">
    .....   
</Android.support.v4.widget.NestedScrollView>
37
Paul Burke

サポートライブラリのバグではないと思うので、これを使用してください

<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:layout_height="match_parent"
    Android:fillViewport="true"
    Android:layout_gravity="fill_vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">
36
LiFei

Android:layout_gravity="fill_vertical"も私のために働きました。

4
Ugo

私は答えに遅れるかもしれませんが、ここに行きます。私は同様の問題を抱えていましたが、上記の解決策のどれも私にとってはうまくいきませんでした。最後に、サポートライブラリのバージョン23を使用して修正しました。

...
compileSdkVersion 23
...
targetSdkVersion 23
...
compile 'com.Android.support:appcompat-v7:23.1.0'
compile 'com.Android.support:support-v4:23.1.0'
compile 'com.Android.support:design:23.1.0'
3
Aleks Nine

OnMeasureChild()メソッドは、レイアウトプロセス中に何度も呼び出されます。どうやら、キーはプロセスの早い段階で子の高さのゼロ以外の値を取得しています。 ScrollingViewBehaviorは、次の場合に失敗します。

int scrollRange = appBar.getTotalScrollRange();
int height = parent.getHeight() 
             - appBar.getMeasuredHeight()
             + scrollRange;

FixedScrollingviewBehaviorはこれを次のように修正します。

int height = parent.getHeight() 
             - appBar.getMeasuredHeight() 
             + Math.min(scrollRange, parent.getHeight() - heightUsed);

非常に早い段階で、アプリバーの高さである-128の値が高さになります。

オリジナルに近い別の方法は次のとおりです。

int height = parent.getMeasuredHeight()
             - appBar.getMeasuredHeight()
             + scrollRange;
2
Jon