NestedScrollView onClick事件不能正常工作

本文介绍了一个关于NestedScrollView与CoordinatorLayout结合使用时出现的点击事件失灵问题及其解决方案。当进行滚动操作后,原本应该响应的点击事件无法立即生效,需要通过额外的点击才能触发。文中提供了一个修改过的NestedScrollView类,通过调整内部Scroller的处理逻辑解决了此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问 题

我用NestedScrollView与CoordinatorLayout,使滚动动画工具栏。(由应用程序:layout_scrollFlags =“滚动| enterAlways”)

NestedScrollView包含的LinearLayout作为根的孩子,我把2 TextViews到LinearLayout中,使展开/折叠动画。一个设置可见 而另一个被设置为不见了。而通过的LinearLayout的onClick事件切换的知名度。

通常情况下,一切都按预期方式工作,但是当我滚动的NestedScrollView onClick事件不能正常工作。我需要滚动后双击即可得到展开/折叠动画

有没有人有同样的问题我吗?请帮我

 < android.support.design.widget.CoordinatorLayout的xmlns:机器人=“htt​​p://schemas.android.com/apk/res/android”
的xmlns:程序=“htt​​p://schemas.android.com/apk/res-auto”
机器人:layout_width =“match_parent”
机器人:layout_height =“match_parent”>

< android.support.v4.widget.NestedScrollView
    机器人:layout_width =“match_parent”
    机器人:layout_height =“match_parent”
    应用程序:layout_behavior =“@字符串/ appbar_scrolling_view_behavior”>

    <的LinearLayout
        机器人:layout_width =“match_parent”
        机器人:layout_height =“match_parent”
        机器人:方向=“垂直”
        机器人:paddingBottom会=“98dp”
        机器人:以下属性来=“24dp”
        机器人:paddingRight =“24dp”>

        < android.support.v7.widget.AppCompatTextView
            机器人:ID =“@ + ID / detail_expense_reason_trim”
            机器人:layout_width =“match_parent”
            机器人:layout_height =“WRAP_CONTENT”
            机器人:单线=“假”
            机器人:文字颜色=“@色/ add_new_expense_text_color”/>

        < android.support.v7.widget.AppCompatTextView
            机器人:ID =“@ + ID / detail_expense_reason”
            机器人:layout_width =“match_parent”
            机器人:layout_height =“WRAP_CONTENT”
            机器人:单线=“假”
            机器人:文字颜色=“@色/ add_new_expense_text_color”
            机器人:能见度=“水涨船高”/>
    < / LinearLayout中>

< /android.support.v4.widget.NestedScrollView>

< android.support.design.widget.AppBarLayout
    机器人:layout_width =“match_parent”
    机器人:layout_height =“WRAP_CONTENT”>

    < android.support.v7.widget.Toolbar
        机器人:ID =“@ + ID / detail_expense_toolbar”
        机器人:layout_width =“match_parent”
        机器人:layout_height =“?ATTR / actionBarSize”
        机器人:主题=“@风格/ ThemeOverlay.AppCompat.Dark.ActionBar”
        应用程序:layout_scrollFlags =“滚动| enterAlways”
        应用程序:popupTheme =“@风格/ ThemeOverlay.AppCompat.Light”/>
< /android.support.design.widget.AppBarLayout>
 

  @InjectView(R.id.detail_expense_reason)
AppCompatTextView originalReason;

@InjectView(R.id.detail_expense_reason_trim)
AppCompatTextView trimReason;

@InjectView(R.id.detail_expense_container)
的LinearLayout expenseContainer;
 

//处理事件

 公共无效的onClick(){
    如果(originalReason.getVisibility()== View.VISIBLE){
        originalReason.setVisibility(View.GONE);
        trimReason.setVisibility(View.VISIBLE);
    } 其他 {
        originalReason.setVisibility(View.VISIBLE);
        trimReason.setVisibility(View.GONE);
    }

}
 
解决方案

这是NestedScrollView的一个bug,该bug的详细信息可以在这里找到:的问题。问题是, mScroller.isFinished()在 onInterceptTouchEvent(MotionEvent EV)将不会返回真正的后一扔操作(即使一扔已停止)。因此,触摸事件截获。

这个错误已经报道了一段时间,但仍然没有得到解决。所以我通过自己的版本的bug修复这个问题产生。我实现了我自己的 NestedScrollView ,复制所有的code从 NestedScrollView ,并具有与如下修改:

 公共类NestedScrollView扩展的FrameLayout实现NestedScrollingParent,NestedScrollingChild {
    ...
    私人无效initScrollView(){
        ...
        //替换这行:
        // mScroller =新ScrollerCompat(的getContext(),NULL);
        mScroller = ScrollerCompat.create(的getContext(),NULL);
        ...
    }

    @覆盖
    公共布尔onInterceptTouchEvent(MotionEvent EV){
        ...
        开关(行动及放大器; MotionEventCompat.ACTION_MASK){
            ...
            案例MotionEvent.ACTION_DOWN:{
                ...
                //替换这行:
                // mIsBeingDragged = mScroller.isFinished()!;
                mIsBeingDragged = FALSE;
                ...
            }
        }
    }
}
 

和本 NestedScrollView 应具有相同的行为与原来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值