setAllowClickWhenDisabled设置后失效,点击禁用视图无响应
setAllowClickWhenDisabled(true) 我需要实现点击已禁用(置灰)的ReadOnlySwitchView打开新Activity。在API33环境下,先在onCreateView中调用setAllowClickWhenDisabled(true),再绑定自定义的OnReadOnlySwitchClickListener,之后通过isEnabled=false禁用该视图,但点击后完全没反应,怀疑是视图重叠或其他问题。
设置点击监听的代码
private fun setupStatusClickListeners() { Log.i(TAG, "setupStatusClickListeners: ") binding.myStatusToggle()?.apply { setOnReadOnlySwitchClickListener(object : OnReadOnlySwitchClickListener { override fun onReadOnlySwitchClick(p0: View?) { openUnitStatusActivity() } }) } }
onCreateView代码
fun onCreateView(fragment: CcLoginDetailsFragment) { if (!FeatureProvider.Feature.COMMAND_CENTRAL_LOGIN.supported) { return } commandCentralLoginPresenter.onViewCreated(fragment) viewModel.setupBanner(activity.application) binding.myStatusProgress()?.visibility = View.GONE binding.unitId()?.visibility = View.GONE binding.myStatusToggle()?.visibility = View.GONE binding.unitIdOtherDetails()?.visibility = View.GONE binding.myStatusToggle()?.apply { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { Log.i(TAG, "setupStatusClickListeners2: ") setAllowClickWhenDisabled(true) } } setupStatusClickListeners() }
禁用视图的代码
if (viewModel.isSecondaryStatusSupported.value) { //some stuff binding.myStatusToggle()?.visibility = View.VISIBLE binding.myStatusProgress()?.visibility = View.GONE binding.myStatusToggle()?.isEnabled = false //other stuff }
自定义视图XML
<com.motorolasolutions.uiframework.ReadOnlySwitchView android:id="@+id/viewStatusOnDutyToggle" android:layout_width="match_parent" android:layout_height="wrap_content" app:auto_toggle="false" app:text_primary="@string/title_my_status" app:text_secondary="@string/status_off_duty" />
可能的原因及解决办法
自定义视图内部事件拦截:
ReadOnlySwitchView作为自定义视图,可能未正确处理setAllowClickWhenDisabled(true)的逻辑。比如内部子View在禁用状态下仍拦截点击,或者自定义监听未在视图禁用时被触发。
处理:检查ReadOnlySwitchView源码,确认是否将allowClickWhenDisabled设置传递给内部可点击子View,或在禁用状态下是否分发点击事件到自定义监听。若未处理,需修改自定义视图代码,在onTouchEvent或dispatchTouchEvent中,当isEnabled=false且allowClickWhenDisabled为true时,主动触发OnReadOnlySwitchClickListener回调。视图重叠覆盖:排查布局中是否有其他View(如透明View、意外显示的进度条)覆盖在
ReadOnlySwitchView上方。可通过Android Studio的Layout Inspector工具查看视图层级,确认目标视图处于可点击的最上层。属性设置时机问题:虽然当前代码顺序正确,但可尝试在设置
isEnabled=false前再次调用setAllowClickWhenDisabled(true),避免后续状态重置覆盖该设置。自定义监听绑定失效:确认
setOnReadOnlySwitchClickListener是否正确绑定,以及回调逻辑在视图禁用时是否被触发。可在onReadOnlySwitchClick方法中添加日志,或在视图事件分发流程中加日志,排查事件是否传递到监听回调。
内容的提问来源于stack exchange,提问作者Wei Sen Ng

