将TapGestureRecognizer添加到ViewCell后,Ripple效果消失了

时间:2016-11-05 07:05:20

标签: xamarin xamarin.forms

我在ViewCell的根布局中添加了一个自定义LongPressGestureRecognizer来处理某些情况,但在添加后,我发现点击ViewCell时的涟漪效应在Android上消失了。我尝试通过获取原生视图添加动画,使用下面的代码将背景drawable设置为Android.Resource.Attribute.SelectableItemBackground

            int[] attrs = { Android.Resource.Attribute.SelectableItemBackground };

            var ta = CrossCurrentActivity.Current.Activity.ObtainStyledAttributes(attrs);

            var drawable = ta.GetDrawable(0);
            nativeView.SetBackgroundDrawable(drawable);
            ta.Recycle();

即使这样也行不通。还有其他任何方法可以使它发挥作用吗?

1 个答案:

答案 0 :(得分:0)

对于那些想要了解的人,我放弃了自定义长按手势识别器实现目标的方式,因为这是错误的做事方式。在Android上,我们应该使用ItemLongClick事件。这是我做的,首先,通过某种方法找出原生ListView,我的方法是首先获得ListView的渲染器,然后获得基础ListView。另一种方法是使用下面的代码来查找ListView,但如果您有多个ListView

,这种方式需要更多工作
public static List<T> FindViews<T>(this ViewGroup viewGroup) where T : View
    {
        var result = new List<T>();

        var count = viewGroup.ChildCount;
        for (int i = 0; i < count; i++)
        {
            var child = viewGroup.GetChildAt(i);
            var item = child as T;
            if (item != null)
            {
                result.Add(item);
            }
            else if (child is ViewGroup)
            {
                var innerResult = FindViews<T>(child as ViewGroup);
                if (innerResult != null)
                {
                    result.AddRange(innerResult);
                }
            }
        }
        return result;
    }
    var rootView =(ViewGroup)CurrentActivity.Window.DecorView.RootView
    var nativeListView = rootView.FindView<Android.Widget.ListView>();

然后覆盖OnAppearing的{​​{1}}方法,其中包含Page事件处理程序。同样覆盖ItemLongClick方法,在其中分离OnDisappearing事件处理程序。这个很重要。简单地在构造函数中添加ItemLongClick事件处理程序似乎不起作用。