NestedScrollView + CodinatorLayout scrollBy() scrollTo() 方法什么都不做 [英] NestedScrollView + CoodinatorLayout scrollBy() scrollTo() methods do nothing

查看:31
本文介绍了NestedScrollView + CodinatorLayout scrollBy() scrollTo() 方法什么都不做的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 NestedScrollView 与 CoordinatorLayout + AppBarLayout + CollapsingToolbarLayout 一起使用,具有类似于 本教程

我需要以编程方式滚动内容(最好是平滑滚动,即动画),但是调用滚动方法(scrollBy()、scrollTo()、smoothScrollTo()、smoothScrollBy())什么都不做.

请注意,我使用的是 app:layout_behavior="@string/appbar_scrolling_view_behavior" <-- 不确定问题是否与此有关.

当用户单击按钮时,我正在 Kotlin 中调用 nsv_form.smoothScrollBy(0, 300),但没有任何反应:(

(也试过 scrollTo(), scrollBy(), +- 300, 各种不同的变体)

更新:我研究了源代码,似乎 *scroll*() 方法期望布局的内容大于父视图(有道理).就我而言,内容较小,所以我怀疑这就是滚动方法不起作用的原因.也许我需要一些不同的东西而不是 scroll?

NestedScrollView 的位置开始部分离开屏幕,上面有一个 CollapsingToolbarLayout 中的图像,像这样,所以看起来我需要以编程方式移动 NestedScrollView 的位置并触发 CoordinatorLayout 的滚动行为.-- 我该怎么做?

这是我的布局:

<com.google.android.material.appbar.AppBarLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/transparent"><com.google.android.material.appbar.CollapsingToolbarLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"机器人:fitsSystemWindows =真"应用程序:expandedTitleMarginEnd="64dp"应用程序:expandedTitleMarginStart="48dp"app:layout_scrollFlags="scroll|exitUntilCollapsed"><图像视图android:id="@+id/iv_image"android:layout_width="match_parent"android:layout_height="@dimen/image_height"android:scaleType="centerCrop"应用程序:layout_collapseMode="视差"工具:src="@drawable/some_image"/></com.google.android.material.appbar.CollapsingToolbarLayout></com.google.android.material.appbar.AppBarLayout><androidx.core.widget.NestedScrollViewandroid:id="@+id/nsv_form"android:layout_width="match_parent"android:layout_height="match_parent"机器人:背景=@颜色/白色"app:layout_behavior="@string/appbar_scrolling_view_behavior"><线性布局android:layout_width="match_parent"android:layout_height="wrap_content"android:animateLayoutChanges="true"机器人:方向=垂直">[...子视图...]</LinearLayout></androidx.core.widget.NestedScrollView></androidx.coordinatorlayout.widget.CoordinatorLayout>

TLDR:如何以编程方式像这样滚动?>

解决方案

如何以编程方式像这样滚动?

对于这种滚动行为,您需要折叠或展开 CollapsingToolbarLayout 无需滚动您的 NestedScrollView

这是示例代码

试试这个在您的布局中进行一些以下更改

<com.google.android.material.appbar.AppBarLayoutandroid:id="@+id/app_bar"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/transparent"android:fitsSystemWindows="true"><com.google.android.material.appbar.CollapsingToolbarLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"机器人:fitsSystemWindows =真"应用程序:expandedTitleMarginEnd="64dp"应用程序:expandedTitleMarginStart="48dp"app:layout_scrollFlags="scroll|exitUntilCollapsed"><图像视图android:id="@+id/iv_image"android:layout_width="match_parent"android:layout_height="250dp"android:adjustViewBounds="true"android:scaleType="fitXY"android:src="@drawable/悟空"应用程序:layout_collapseMode="视差"app:layout_collapseParallaxMultiplier="0.7"/><androidx.appcompat.widget.Toolbarandroid:id="@+id/工具栏"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"应用程序:layout_collapseMode="pin"应用程序:contentInsetLeft="0dp"应用程序:contentInsetStart="0dp"app:contentInsetStartWithNavigation="0dp"app:titleTextAppearance="@style/AppTheme.Toolbar.Title"app:popupTheme="@style/AppTheme.PopupOverlay"/></com.google.android.material.appbar.CollapsingToolbarLayout></com.google.android.material.appbar.AppBarLayout><com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:background="@color/Boxcolordiabled"应用程序:layout_anchor="@id/app_bar"应用程序:layout_anchorGravity="底部|结束"app:srcCompat="@drawable/ic_favorite"/><androidx.core.widget.NestedScrollViewandroid:id="@+id/nsv_form"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/holo_blue_light"app:layout_behavior="@string/appbar_scrolling_view_behavior"><线性布局android:layout_width="match_parent"android:layout_height="wrap_content"android:animateLayoutChanges="true"机器人:方向=垂直"><文本视图android:layout_width="match_parent"android:layout_height="wrap_content"机器人:填充=10dp"android:text="@string/demo"/><按钮android:id="@+id/btnColl"android:layout_width="match_parent"android:layout_height="wrap_content"机器人:填充=10dp"android:text="展开"/><文本视图android:layout_width="match_parent"android:layout_height="wrap_content"机器人:填充=10dp"android:text="@string/demo"/><文本视图android:layout_width="match_parent"android:layout_height="wrap_content"机器人:填充=10dp"android:text="@string/demo"/><文本视图android:layout_width="match_parent"android:layout_height="wrap_content"机器人:填充=10dp"android:text="@string/demo"/><文本视图android:layout_width="match_parent"android:layout_height="wrap_content"机器人:填充=10dp"android:text="@string/demo"/><文本视图android:layout_width="match_parent"android:layout_height="wrap_content"机器人:填充=10dp"android:text="@string/demo"/><文本视图android:layout_width="match_parent"android:layout_height="wrap_content"机器人:填充=10dp"android:text="@string/demo"/><文本视图android:layout_width="match_parent"android:layout_height="wrap_content"机器人:填充=10dp"android:text="@string/demo"/></LinearLayout></androidx.core.widget.NestedScrollView></androidx.coordinatorlayout.widget.CoordinatorLayout>

<块引用>

活动代码

import android.animation.ValueAnimator;导入 android.os.Bundle;导入 android.view.View;导入 android.view.animation.DecelerateInterpolator;导入 android.widget.Button;导入 android.widget.Toast;导入 com.google.android.material.appbar.AppBarLayout;导入 com.google.android.material.floatingactionbutton.FloatingActionButton;导入 androidx.annotation.Nullable;导入 androidx.appcompat.app.AppCompatActivity;导入 androidx.appcompat.widget.Toolbar;导入 androidx.coordinatorlayout.widget.CoordinatorLayout;导入 neel.com.bottomappbar.R;公共类 MainActivity 扩展 AppCompatActivity {工具栏工具栏;AppBarLayout app_bar;按钮 btnCol;FloatingActionButton fab;CoordinatorLayout 根视图;@覆盖protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);工具栏 = findViewById(R.id.toolbar);setSupportActionBar(工具栏);getSupportActionBar().setDisplayHomeAsUpEnabled(true);getSupportActionBar().setTitle("堆栈演示");app_bar = findViewById(R.id.app_bar);btnColl = findViewById(R.id.btnColl);fab = findViewById(R.id.fab);rootView = findViewById(R.id.rootView);fab.setOnClickListener(new View.OnClickListener() {@覆盖公共无效onClick(查看视图){Toast.makeText(MainActivity.this, "Collapse FAB Clicked", Toast.LENGTH_SHORT).show();CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) app_bar.getLayoutParams();最终 AppBarLayout.Behavior 行为 = (AppBarLayout.Behavior) params.getBehavior();如果(行为!= null){ValueAnimator valueAnimator = ValueAnimator.ofInt();valueAnimator.setInterpolator(new DecelerateInterpolator());valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@覆盖public void onAnimationUpdate(ValueAnimator 动画) {behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());app_bar.requestLayout();}});valueAnimator.setIntValues(0, -900);valueAnimator.setDuration(1000);valueAnimator.start();}}});btnColl.setOnClickListener(new View.OnClickListener() {@覆盖公共无效onClick(查看视图){Toast.makeText(MainActivity.this, "Expand btnColl Clicked", Toast.LENGTH_SHORT).show();CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) app_bar.getLayoutParams();最终 AppBarLayout.Behavior 行为 = (AppBarLayout.Behavior) params.getBehavior();如果(行为!= null){ValueAnimator valueAnimator = ValueAnimator.ofInt();valueAnimator.setInterpolator(new DecelerateInterpolator());valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@覆盖public void onAnimationUpdate(ValueAnimator 动画) {behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());app_bar.requestLayout();}});valueAnimator.setIntValues(-900, 0);valueAnimator.setDuration(400);valueAnimator.start();}}});}}

输出

https://www.youtube.com/watch?v=nZY1zPxjRt0

I have a NestedScrollView being used with CoordinatorLayout + AppBarLayout + CollapsingToolbarLayout with parallax effect similar to this tutorial

I need to scroll the content programmatically (preferably a smooth scroll, i.e. animated), however calling the scroll methods (scrollBy(), scrollTo(), smoothScrollTo(), smoothScrollBy()) do nothing.

Note that I am using app:layout_behavior="@string/appbar_scrolling_view_behavior" <-- Not sure if the issue is related to this.

I'm calling nsv_form.smoothScrollBy(0, 300) in Kotlin when a button is clicked by the user, but nothing happens :(

(Also tried scrollTo(), scrollBy(), +- 300, all sorts of different variations)

UPDATE: I dug into source code and it seems like the *scroll*() methods expect the content of the layout to be larger than the parent view (makes sense). In my case, the content is smaller, so I suspect that's why the scrolling methods do not work. Perhaps I need something different instead of scroll?

The NestedScrollView's position starts partially off the screen with an image above it in a CollapsingToolbarLayout, like this, so it seems like I need to programmatically move the position of the NestedScrollView AND trigger the CoordinatorLayout's scrolling behavior. -- How do I do this?

Here's my layout:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.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:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/iv_image"
                android:layout_width="match_parent"
                android:layout_height="@dimen/image_height"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax"
                tools:src="@drawable/some_image" />

        </com.google.android.material.appbar.CollapsingToolbarLayout>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView
        android:id="@+id/nsv_form"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true"
            android:orientation="vertical">

            [... child views...]

        </LinearLayout>

    </androidx.core.widget.NestedScrollView>    
</androidx.coordinatorlayout.widget.CoordinatorLayout>

TLDR: How do I scroll like this programmatically?

解决方案

How do I scroll like this programmatically?

For that scrolling behavior you need collapse or expand CollapsingToolbarLayout no need to scroll your the NestedScrollView

Here is the sample code for that

Try this Make some below changes in your Layout

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.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:id="@+id/rootView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        android:fitsSystemWindows="true">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/iv_image"
                android:layout_width="match_parent"
                android:layout_height="250dp"
                android:adjustViewBounds="true"
                android:scaleType="fitXY"
                android:src="@drawable/goku"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.7" />

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:contentInsetLeft="0dp"
                app:contentInsetStart="0dp"
                app:contentInsetStartWithNavigation="0dp"
                app:titleTextAppearance="@style/AppTheme.Toolbar.Title"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </com.google.android.material.appbar.CollapsingToolbarLayout>

    </com.google.android.material.appbar.AppBarLayout>


    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="@color/Boxcolordiabled"
        app:layout_anchor="@id/app_bar"
        app:layout_anchorGravity="bottom|end"
        app:srcCompat="@drawable/ic_favorite" />

    <androidx.core.widget.NestedScrollView
        android:id="@+id/nsv_form"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_blue_light"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true"
            android:orientation="vertical">


            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="@string/demo" />


            <Button
                android:id="@+id/btnColl"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="Expand " />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="@string/demo" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="@string/demo" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="@string/demo" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="@string/demo" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="@string/demo" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="@string/demo" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="@string/demo" />


        </LinearLayout>

    </androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

Activity code

import android.animation.ValueAnimator;
import android.os.Bundle;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import neel.com.bottomappbar.R;

public class MainActivity extends AppCompatActivity {

    Toolbar toolbar;
    AppBarLayout app_bar;
    Button btnColl;
    FloatingActionButton fab;
    CoordinatorLayout rootView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Stack Demo");

        app_bar = findViewById(R.id.app_bar);
        btnColl = findViewById(R.id.btnColl);
        fab = findViewById(R.id.fab);
        rootView = findViewById(R.id.rootView);


        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Toast.makeText(MainActivity.this, "Collapse FAB Clicked", Toast.LENGTH_SHORT).show();

                CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) app_bar.getLayoutParams();
                final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();

                if (behavior != null) {
                    ValueAnimator valueAnimator = ValueAnimator.ofInt();
                    valueAnimator.setInterpolator(new DecelerateInterpolator());

                    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator animation) {
                            behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
                            app_bar.requestLayout();
                        }
                    });

                    valueAnimator.setIntValues(0, -900);
                    valueAnimator.setDuration(1000);
                    valueAnimator.start();
                }
            }
        });

        btnColl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Toast.makeText(MainActivity.this, "Expand btnColl Clicked", Toast.LENGTH_SHORT).show();

                CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) app_bar.getLayoutParams();
                final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
                if (behavior != null) {

                    ValueAnimator valueAnimator = ValueAnimator.ofInt();
                    valueAnimator.setInterpolator(new DecelerateInterpolator());

                    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator animation) {
                            behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
                            app_bar.requestLayout();
                        }
                    });

                    valueAnimator.setIntValues(-900, 0);
                    valueAnimator.setDuration(400);
                    valueAnimator.start();
                }


            }
        });
    }


}

OUTPUT

https://www.youtube.com/watch?v=nZY1zPxjRt0

这篇关于NestedScrollView + CodinatorLayout scrollBy() scrollTo() 方法什么都不做的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆