これはばかげた質問かもしれませんが、Design libをよく理解していませんでした。私は このリファレンス に従ってレイアウトを作成しています。 GridView
をスクロールすると、青い領域が視差として機能するはずです。しかし、グリッドビューをスクロールしても、AppBarLayoutで何も起こりません。
しかし、これはNestedScrollView
とRecyclerView
で動作します
以下はマイレイアウトファイルです
<?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/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:background="#500403"
Android:layout_height="@dimen/detail_backdrop_height"
Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
Android:fitsSystemWindows="true">
<Android.support.design.widget.CollapsingToolbarLayout
Android:id="@+id/collapsing_toolbar"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#122453"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
Android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="64dp">
<ImageView
Android:id="@+id/backdrop"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:scaleType="centerCrop"
Android:fitsSystemWindows="true"
app:layout_collapseMode="parallax" />
<ImageView
Android:id="@+id/backdrop1"
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:scaleType="fitCenter"
Android:fitsSystemWindows="true"
Android:layout_gravity="center"
Android:src="@drawable/bar_offline"
app:layout_collapseMode="parallax" />
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="#982223"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="pin" />
</Android.support.design.widget.CollapsingToolbarLayout>
</Android.support.design.widget.AppBarLayout>
<GridView
Android:id="@+id/grid"
Android:numColumns="4"
Android:background="#367723"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
<Android.support.design.widget.FloatingActionButton
Android:layout_height="wrap_content"
Android:layout_width="wrap_content"
app:layout_anchor="@id/appbar"
app:layout_anchorGravity="bottom|right|end"
Android:src="@drawable/bar_offline"
Android:layout_margin="@dimen/fab_margin"
Android:clickable="true"/>
</Android.support.design.widget.CoordinatorLayout>
任意の助けをいただければ幸いです。
ListView/GridViewでは、次のコードによってLollipopでのみ機能します。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
listView.setNestedScrollingEnabled(true);
}
Now CoordinatorLayoutはRecyclerView
とNestedScrollView
でのみ動作すると思います
se-
ViewCompat.setNestedScrollingEnabled(listView/gridview,true); (add Android Support v4 Library 23.1 or +)
サポートライブラリに簡単なソリューションが追加されました。
ViewCompat.setNestedScrollingEnabled(listView,true);
Android Support v4 Library 23.1でテストしましたが、うまく機能します。
現在、ListView
とGridView
には、API> 21でのみCoordinatorLayout
で予期される動作があります。
この動作を取得するには、設定する必要があります。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
setNestedScrollingEnabled(true);
}
NestedScrollingChild
を実装するだけでは不十分です。 AbsListView
はサポートライブラリと共に展開されないため、デバイスで実行されるSOによって異なります。
AbsListViewのいくつかのメソッドをオーバーライドする必要があります。たとえば、onInterceptTouchEvent
メソッドを確認できます。
このコード内では次を確認できます。
case MotionEvent.ACTION_DOWN: {
//......
startNestedScroll(SCROLL_AXIS_VERTICAL);
//....
}
case MotionEvent.ACTION_MOVE: {
//.....
if (startScrollIfNeeded((int) ev.getX(pointerIndex), y, null)) {
//....
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: {
//..
stopNestedScroll();
break;
}
このコードは、AbsListView v21 +の実装にのみあります。 API 2以下でAbsListViewをチェックすると、ネストされたスクロール参照は見つかりません。
通常どおりNestedScrollview内にgridviewを配置する必要があり、その後gridviewの高さを動的に追加する必要があります。その後、すべてがうまく動作します。!!!
<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="match_parent"
Android:layout_height="match_parent"
Android:layout_gravity="fill_vertical"
Android:fillViewport="true">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<GridView
Android:id="@+id/camp_list"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_below="@id/toolbar"
Android:layout_margin="10dp"
Android:gravity="center"
Android:horizontalSpacing="10dp"
Android:numColumns="3"
Android:stretchMode="columnWidth"
Android:verticalSpacing="10dp"
Android:visibility="visible" >
</GridView>
</LinearLayout>
</Android.support.v4.widget.NestedScrollView>
便宜上、新しいViewCompatソリューションを使用してサブクラスを作成しました。
public class CoordinatedListView extends ListView {
public CoordinatedListView(Context context) {
super(context);
init();
}
public CoordinatedListView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CoordinatedListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@RequiresApi(api = Build.VERSION_CODES.Lollipop)
public CoordinatedListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
ViewCompat.setNestedScrollingEnabled(this, true);
}
}
楽しい :)