CoordinatorLayout
およびNestedScrollView
に奇妙な問題があります(設計サポートライブラリ22.2.0を使用)
NestedScrollView
より小さいコンテンツを使用する固定コンテンツが必要です。しかし、コンテンツを上下にスクロールしようとすると、コンテンツが移動し、自分の場所に再び移動することはありません。
ここに小さなサンプル:
ここにコード:
<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>
これは、詳細フラグメント内の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>
サポートライブラリのバグではないと思うので、これを使用してください
<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">
Android:layout_gravity="fill_vertical"
も私のために働きました。
私は答えに遅れるかもしれませんが、ここに行きます。私は同様の問題を抱えていましたが、上記の解決策のどれも私にとってはうまくいきませんでした。最後に、サポートライブラリのバージョン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'
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;