wake-up-neo.com

App einstellen: layout_behavior programmgesteuert

Ich habe ein Koordinatorlayout mit einer Recyclingübersicht, die ich programmgesteuert hinzufügen möchte. Der Grund für die programmgesteuerte Hinzufügung liegt darin, dass unterschiedliche Fragmente, die das Koordinatorlayout aufblasen, möglicherweise unterschiedliche Arten von Recycler verwenden. 

Normalerweise für ein Recyclerview, um dieses Verhalten festzulegen, würde ich es in der XML-Datei hinzufügen:

app:layout_behavior="@string/appbar_scrolling_view_behavior"

Das funktioniert gut. Ich bin jedoch völlig ratlos, wie man dieses Verhalten hinzufügt, wenn ich die RecyclerViews programmgesteuert erstelle und dann zum Framelayout hinzufüge:

<?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>
29
AndroidP

Behavior ist ein Parameter des CoordinatorLayout.LayoutParams. Sie können das Verhalten für eine Instanz von CoordinatorLayout.LayoutParams mit der Methode setBehavior festlegen.

Um ein richtiges Behavior-Objekt zu erhalten, das dasselbe wie @string/appbar_scrolling_view_behavior darstellt, müssen Sie eine Instanz von AppBarLayout.ScrollingViewBehavior erstellen.


Edit 1:

Ich habe nicht wirklich ein Beispiel, aber ich kann Ihnen vielleicht eines schreiben. Angenommen, Sie haben ein View (z. B. yourView), das bereits an ein CoordinatorLayout (also bereits LayoutParams) angehängt ist.

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

Möglicherweise müssen Sie dies etwas anpassen (ich habe das nicht getestet, aber es sollte funktionieren).


Edit 2:

Nur ein kleiner Haftungsausschluss, da nicht jeder das Beispiel perfekt zu verstehen scheint.

yourView im obigen Beispiel ist UND NICHT das CoordinatorLayout-Objekt. yourView ist CoordinatorLayout's Kind View.

76
Bartek Lipinski

Die akzeptierte Antwort ist korrekt, aber der bereitgestellte Code kann nicht kompiliert werden. Hier ist also ein vollständiges Beispiel 

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

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

Der zweite Parameter ist AttributeSet und es ist in Ordnung, ihn als null zu haben, obwohl er in support lib nicht als Nullable markiert ist.

1
tasomaniac

Um layout_behavior programmatisch mit kotlin zu aktivieren und zu deaktivieren, verwenden Sie diesen Code:

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
}

Hinweis: Ersetzen Sie swipeRefreshView durch Ihre Ansicht 

0
Kapil Rajput