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>
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
.
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.
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.