web-dev-qa-db-ja.com

app:layout_behaviorをプログラムで設定する

プログラムで追加したいrecyclerviewを持つコーディネーターレイアウトがあります。プログラムで追加された理由は、コーディネーターレイアウトを膨らませるさまざまなフラグメントが異なるタイプのリサイクラビューを使用する可能性があるためです。

通常、recyclerviewの場合、この動作を設定するには、xmlに追加します。

app:layout_behavior="@string/appbar_scrolling_view_behavior"

それはうまくいきます。ただし、プログラムでリサイクラービューを作成し、それらをフレームレイアウトに追加するときに、この動作を追加する方法については完全に迷っています。

<?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"
    xmlns:tools="http://schemas.Android.com/tools" Android:layout_width="match_parent"
    Android:id="@+id/coordLayout"
    Android:layout_height="match_parent" Android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <Android.support.design.widget.AppBarLayout Android:id="@+id/app_bar"
        Android:fitsSystemWindows="true" Android:layout_height="@dimen/app_bar_height"
        Android:layout_width="match_parent" Android:theme="@style/AppTheme.AppBarOverlay">

        <Android.support.design.widget.CollapsingToolbarLayout Android:id="@+id/toolbar_layout"
            Android:fitsSystemWindows="true" Android:layout_width="match_parent"
            Android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:contentScrim="?attr/colorPrimary">

            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_height="?attr/actionBarSize"
                Android:layout_width="match_parent"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

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

    </Android.support.design.widget.AppBarLayout>
    <FrameLayout
        Android:id="@+id/frameLayout"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

    </FrameLayout>

</Android.support.design.widget.CoordinatorLayout>
32
AndroidP

BehaviorCoordinatorLayout.LayoutParamsのパラメーターです。 setBehavior メソッドを使用して、CoordinatorLayout.LayoutParamsのインスタンスに動作を設定できます。

@string/appbar_scrolling_view_behaviorと同じものを表す適切なBehaviorオブジェクトを取得するには、 AppBarLayout.ScrollingViewBehavior のインスタンスを作成する必要があります。


編集1:

実例はありませんが、あなたに書いてもいいでしょう。既にViewに接続されているyourView(たとえばCoordinatorLayout)があると仮定します(したがって、既にLayoutParamsを持っています)。

CoordinatorLayout.LayoutParams params = 
                            (CoordinatorLayout.LayoutParams) yourView.getLayoutParams();
params.setBehavior(new AppBarLayout.ScrollingViewBehavior());
yourView.requestLayout();

少し調整する必要があるかもしれません(テストしていませんが、動作するはずです)。


編集2:

誰もがこの例を完全に理解しているわけではないからです。

上記の例で言及したyourViewは、[〜#〜] not [〜#〜]CoordinatorLayoutそのものです。 yourViewCoordinatorLayout'sViewです。

84
Bartek Lipinski

受け入れられた答えは正しいですが、提供されたコードはコンパイルできません。ここに完全な例があります

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) 
view.getLayoutParams();

params.setBehavior(new AppBarLayout.ScrollingViewBehavior(view.getContext(), null));

2番目のパラメータはAttributeSetであり、nullとしても問題ありませんが、サポートライブラリではNullableとしてマークされていません。

3
tasomaniac

kotlinを使用してプログラムでlayout_behaviorを有効または無効にするには、次のコードを使用します。

fun enableLayoutBehaviour() {
    val param: CoordinatorLayout.LayoutParams = swipeRefreshView.layoutParams as CoordinatorLayout.LayoutParams
    param.behavior = AppBarLayout.ScrollingViewBehavior()
}

fun disableLayoutBehaviour() {
    val param: CoordinatorLayout.LayoutParams = swipeRefreshView.layoutParams as CoordinatorLayout.LayoutParams
    param.behavior = null
}

注:swipeRefreshViewをビューに置き換えます

1
Kapil Rajput