如何检查自定义视图是否具有禁用的父级?

问题描述

我有一个视图,该视图在禁用时会做一些自定义绘图:

override fun onDraw(canvas: Canvas) {
    // Drawing...

    if (!this.isEnabled) {
        // Custom drawing...
    }
}

当父级之一被禁用时,逻辑上也绘制此禁用状态是合理的。但是,即使禁用了其中一个父视图,isEnabled也是正确的。

android:duplicateParentState看起来可以做到,但有时我会深深嵌套此视图,并转移所有状态(受压等)。

规范的处理方式是什么?

解决方法

这是我当前的解决方案:

override fun onDraw(canvas: Canvas) {
    // Drawing...

    // Check for both the view and all its parents.
    if (!this.isEnabled || isAnyParentDisabled(parent)) {
        // Custom drawing...
    }
}

private fun isAnyParentDisabled(parent: ViewParent?): Boolean {
    // Recursively check for each parent if it's 
    // a View that has isEnabled set to false.
    val v = parent as? View ?: return false
    return if (v.isEnabled)
        anyParentDisabled(v.parent)
    else
        true
}

它可以工作,但是每次抽奖时都要经过所有父母。