Android ripple effect not working after catch the click event
事件起因:
布局:LinearLayout上放置TextView和Switch,统一作为RecycleView的一个item,还有一个最底层的布局也是LinearLayout,如下
在第二层LinearLayout上加入如下属性设置
1 2 3 |
android:background="?android:attr/selectableItemBackground" |
1 2 3 4 |
android:clickable="true" android:focusable="true" |
想让RecycleView中textView和Switch点击时产生波纹效果,但是不起作用,通过一步步测试发现LinearLayout设置监听事件后才会不产生波纹效果,但是如果不在LinearLayout上设置Click监听事件,就不能让整个item产生波纹效果,比如如果监听的点击事件在TextView上,那么波纹效果只会在TextView上。
解决办法:
在最底层放置另一种布局 — constraintlayout,再上层之后不变化,还是LinearLayout -> TextView + Switch , TextView和Switch全部设置一个 android:clickable=”false” 属性,在适配器Adapter中统一捕获LinearLayout布局的点击事件,然后再手动书写代码完成按钮等的状态更改,如果按钮忘了设置不可点击属性,那么点击按钮时是不会有波纹效果的。
xml如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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="wrap_content"> <LinearLayout android:id="@+id/setting_layout" android:layout_width="match_parent" android:background="?android:attr/selectableItemBackground" android:clickable="true" android:focusable="true" android:layout_height="53dp" android:orientation="horizontal" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <TextView android:id="@+id/setting_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/settingText_start" android:layout_weight="97" android:clickable="true" android:layout_marginTop="@dimen/settingText_top" android:text="text" android:textColor="@color/colorBlack" android:textSize="16dp" /> <Switch android:id="@+id/setting_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/settingText_top" android:layout_weight="3" android:clickable="false" android:layout_marginEnd="@dimen/switch_end" android:shadowColor="@color/ColorLightBlue" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout> |
适配器中的相关代码:
1 2 3 4 5 6 7 8 9 10 11 |
viewHolder.linearLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //new ToastInEverywhere(settingActivity).showStr("Clicked"); Boolean currentStatus = viewHolder.aSwitch.isChecked(); viewHolder.aSwitch.setChecked(!currentStatus); settingActivity.testMode = !currentStatus; } }); |
注:
作者不是专业的,纯粹一个业余爱好者,可能错误之一不是最底层使用了LinearLayout造成,而是相关配置有问题导致,在此不予求证。
另代码只做参考,包含相关变量在其他文件或其他代码中没有贴上来,所以这些无法直接使用,望周知。