【问题标题】:OnScrollChange(...) not called on horizontal scroll水平滚动时未调用 OnScrollChange(...)
【发布时间】:2019-11-22 07:47:12
【问题描述】:

我有一个 Xamarin.Forms 应用程序 (XF 4.2.0.709249)。

我已将 Scrollview 子类化并在 Android 项目中为它创建了一个渲染器。

我已覆盖 OnScrollChanged 方法并连接到多个 scroll-changed-listeners当滚动视图水平滚动时,它们都不会被调用

我注意到 Android 的 Xamarin.Forms ScrollViewRenderer 在内部使用 HorizontalScrollView 进行水平滚动,这可能缺少调用事件/调用可覆盖方法的实现吗?

编辑:我还注意到,在渲染器 ScrollTo(int x, int y) 方法中设置 x 值对 X-Scrolling 没有任何影响。渲染器内部的ScrollX 永远保持为 0,即使 XamarinForms Scrolled 事件发送更新的 X 坐标。

表单项目

public class FormsScrollView : ScrollView { }

public class SomePage : ContentPage {
    public SomePage() {
        //calls native scroll events
        vertScrollView = new FormsScrollView() { Orientation = ScrollOrientation.Vertical, Content = SomeScrollableContent };

        //never calls native scrollevents in renderer
        horizontalScrollView = new FormsScrollView() { Orientation = ScrollOrientation.Horizontal };
        horizontalScrollView.Content = CreateScrollContent(20, StackOrientation.Horizontal);
        Content = horizontalScrollView;
    }

    private StackLayout CreateScrollContent(int amount, StackOrientation ori)
    {
        var sl = new StackLayout() { Orientation = ori };
        for (int i = 0; i < amount; i++)
            sl.Children.Add(new Label() { Text = "Cool Label " + i });
        return sl;
    }
}

Android 项目

[assembly: ExportRenderer(typeof(FormsScrollView), typeof(FormsScrollView_Droid))]
namespace Coolio.Droid.Renderers
{
    public class FormsScrollView_Droid: ScrollViewRenderer, Android.Views.View.IOnScrollChangeListener
    {
        private readonly IOnScrollChangeListener _scrollListener;

        public FormsScrollView_Droid(Context context) : base(context)
        {
            _scrollListener = new ScrollListener(this);
            SetOnScrollChangeListener(this);
            SetOnScrollChangeListener(_scrollListener);


             this.ScrollX; //never changes, stays 0 forever
             this.ScrollTo(x, y); //setting x has no effect, however setting y does scroll vertically correctly.
        }

        protected override void OnScrollChanged(int l, int t, int oldl, int oldt)
        {
              //never called on horizontal scroll
        }

        public void OnScrollChange(Android.Views.View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY)
        {
             //never called on horizontal scroll
        }
    }


    public class ScrollListener : Java.Lang.Object, Android.Support.V4.Widget.NestedScrollView.IOnScrollChangeListener
    {
        private readonly FormsScrollView_Droid _scrolli;

        public ScrollListener(FormsScrollView_Droid scrolli)
        {
            _scrolli = scrolli;
        }

        public void OnScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY)
        {
            //never called on horizontal scroll
        }
    }
}

【问题讨论】:

  • 你能在 xamarin 表单中分享你的布局吗?我在我的演示中测试它,我只是放了一个ScrollViewOnScrollChangedOnScrollChange被执行了。
  • 感谢您的反馈,我更新了我的 XF Project 示例的布局,看看吧!

标签: android xamarin xamarin.forms scrollview onscrollchanged


【解决方案1】:

参考这个帖子: https://forums.xamarin.com/discussion/62241/problem-setting-on-scroll-listener-to-android-horizontal-scroll-view-class-not-found-exception

我更改了FormsScrollView_Droid 如下代码。

 public class FormsScrollView_Droid: ScrollViewRenderer, ViewTreeObserver.IOnScrollChangedListener
{
   // private readonly IOnScrollChangeListener _scrollListener;

public FormsScrollView_Droid(Context context) : base(context)
{

        ViewTreeObserver.AddOnScrollChangedListener(this);

   // SetOnScrollChangeListener(_scrollListener);
}


protected override void OnScrollChanged(int l, int t, int oldl, int oldt)
{
    //called on Vertical scroll
}

public void OnScrollChange(Android.Views.View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY)
{

}

  public void OnScrollChanged()
  {
       //called on Horizontal scroll
  }
}

这里正在运行 GIF。

【讨论】:

  • 看起来很有希望!非常酷的 gif 可视化它达到断点!我今晚会测试,但如果你有时间,我仍然会问:你能检查“ScrollX”属性是否发生变化吗?最好在 OnScrollChanged 方法内
  • 我确实没有看到 ScrollViewRenderer 的 ScrollX 参数有任何变化。很高兴看到 onscrollchanged 被击中,但我还必须提取它滚动的距离......你知道吗?
  • 好的对不起垃圾邮件,再次感谢您向我显示回调。可悲的是 ScrollViewRenderers ScrollX 保持为 0 并且 ScrollTo(x, y) 不会影响 X 轴滚动。我将不得不为此提出另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多