web-dev-qa-db-fra.com

Définition de l'application: layout_behavior par programme

J'ai une mise en page de coordinateur avec une vue de recyclage que j'aimerais ajouter par programme. La raison pour laquelle elle est ajoutée par programmation est due au fait que différents fragments qui gonflent la mise en page du coordinateur peuvent utiliser différents types de recyclerviews. 

En règle générale, pour une vue de recyclage, afin de définir ce comportement, je l’ajouterais au format XML:

app:layout_behavior="@string/appbar_scrolling_view_behavior"

Cela fonctionne bien. Cependant, je ne sais absolument pas comment ajouter ce comportement lorsque je crée les aperçus recyclervers par programme, puis que je les ajoute à framelayout:

<?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 est un paramètre du CoordinatorLayout.LayoutParams. Vous pouvez définir le comportement sur une instance de CoordinatorLayout.LayoutParams avec setBehavior method.

Pour obtenir un objet Behavior correct qui représente la même chose que @string/appbar_scrolling_view_behavior, vous devez créer une instance de AppBarLayout.ScrollingViewBehavior .


Éditer 1:

Je n'ai pas vraiment d'exemple, mais je peux peut-être vous en écrire un. En supposant que vous avez une View (par exemple, yourView) déjà attachée à une CoordinatorLayout (elle a donc déjà LayoutParams).

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

Vous devrez peut-être modifier un peu cela (je n'ai pas testé cela, mais cela devrait fonctionner).


Edit 2:

Juste un petit disclaimer car tout le monde ne semble pas comprendre parfaitement cet exemple.

yourView mentionné dans l'exemple ci-dessus est ET NON le CoordinatorLayout lui-même. yourView est CoordinatorLayout's enfant View.

76
Bartek Lipinski

La réponse acceptée est correcte mais le code fourni n'est pas compilable. Alors voici un exemple complet 

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

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

2nd param est AttributeSet et il est correct de l'avoir comme null bien qu'il ne soit pas marqué Nullable dans le support lib.

1
tasomaniac

Pour activer et désactiver layout_behavior par programme avec kotlin , utilisez ce 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
}

Remarque: remplacez swipeRefreshView par votre vue. 

0
Kapil Rajput