You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:10:20