J'essaie d'implémenter CollapsingToolbarLayout avec un NestedScrollView et il affiche le TextView dans le NestedScrollView en bas et n'autorise pas le défilement ou la réduction de la barre d'outils. J'ai obtenu cela pour fonctionner avec un RecyclerView mais pas NestedScrollView. Lorsque je supprime app:layout_behavior="@string/appbar_scrolling_view_behavior
, la barre d'outils se réduit, mais NestedScrollView n'est pas inférieur à AppBarLayout. Des solutions ou des suggestions pour résoudre ce problème?
XML
<Android.support.design.widget.CoordinatorLayout
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:fitsSystemWindows="true">
<Android.support.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:gravity="center"
Android:text="Hello"
Android:textColor="#000"
Android:textSize="16sp"/>
</LinearLayout>
</Android.support.v4.widget.NestedScrollView>
<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<Android.support.design.widget.CollapsingToolbarLayout
Android:id="@+id/collapsing_toolbar"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
Android:id="@+id/backdrop"
Android:layout_width="match_parent"
Android:layout_height="134dp"
Android:background="@color/primary"
app:layout_collapseMode="parallax"/>
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"/>
</Android.support.design.widget.CollapsingToolbarLayout>
</Android.support.design.widget.AppBarLayout>
</Android.support.design.widget.CoordinatorLayout>
Résultat
Passez à une certaine hauteur dans AppbarLayout. Exemple:
Android:layout_height="300dp".
Le problème principal étant que la vue de défilement imbriquée n’a pas assez de vues pour provoquer un défilement. Par conséquent, l'effet de parallaxe ne fonctionnerait pas.
Voici un exemple de travail utilisant NestedScrollView et CollapsingToolbarLayout
J'ai eu le même problème et écrit une sorte de solution miracle pour cela. En supposant que votre étiquette LinearLayout
contenant "Hello" soit liée à mContainer
et que votre Toolbar
soit liée à mToolbar
, vous pouvez utiliser ceci:
private void fixNestedScrollViewScrolling() {
final int bottomMargin = getScreenHeight() - mContainer.getHeight() - mToolbar.getHeight();
final FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
mContainer.getLayoutParams());
layoutParams.setMargins(0, 0, 0, bottomMargin);
mContainer.setLayoutParams(layoutParams);
}
private int getScreenHeight() {
final Display display = getWindowManager().getDefaultDisplay();
final Point size = new Point();
display.getSize(size);
return size.y;
}
Cette méthode de correction est appelée dans la méthode onCreate
de ma Activity
:
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single_post);
fixNestedScrollViewScrolling();
// some other stuff here ...
}