键盘焦点循环时怎样跳过隐藏和禁用控件:二十步控件状态与焦点循环·实例26
用键盘在界面中逐项移动焦点,需要跳过暂时隐藏或无法操作的控件。当前控件消失后,焦点不能留在不可操作位置,也不应无故卡住整个遍历。
下面把一个游戏界面或模拟规则拆成可复查的记录。每组输入独立给出,先确认单位、先后次序和边界,再核对结果。它不依赖具体游戏的隐藏参数,读者可以直接挑选几步手工复算。
输入与规则
八个控件按编号排成一环,只有可见且启用的控件可获焦点。向前或向后操作从当前编号后继方向寻找,下一个可用项可绕回;没有焦点时,向前选最小可用编号,向后选最大。状态改变让当前失效时,按向前规则立即转移。没有焦点而重新出现可用项时,选择最小可用编号。
初始[可见标记,启用标记][[True, True, True, True, True, True, True, False], [True, True, True, True, False, True, True, True]],初始焦点0 二十步操作[['next'], ['visible', 7], ['next'], ['next'], ['next'], ['next'], ['visible', 7], ['enabled', 0], ['visible', 0], ['prev'], ['next'], ['prev'], ['hide_all'], ['next'], ['show', 3], ['enable', 3], ['prev'], ['show', 6], ['enable', 6], ['next']]
逐步记录
第1步['next'],当前可用编号[0, 1, 2, 3, 5, 6],焦点1。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第2步['visible', 7],当前可用编号[0, 1, 2, 3, 5, 6, 7],焦点1。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第3步['next'],当前可用编号[0, 1, 2, 3, 5, 6, 7],焦点2。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第4步['next'],当前可用编号[0, 1, 2, 3, 5, 6, 7],焦点3。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第5步['next'],当前可用编号[0, 1, 2, 3, 5, 6, 7],焦点5。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第6步['next'],当前可用编号[0, 1, 2, 3, 5, 6, 7],焦点6。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第7步['visible', 7],当前可用编号[0, 1, 2, 3, 5, 6],焦点6。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第8步['enabled', 0],当前可用编号[1, 2, 3, 5, 6],焦点6。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第9步['visible', 0],当前可用编号[1, 2, 3, 5, 6],焦点6。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第10步['prev'],当前可用编号[1, 2, 3, 5, 6],焦点5。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第11步['next'],当前可用编号[1, 2, 3, 5, 6],焦点6。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第12步['prev'],当前可用编号[1, 2, 3, 5, 6],焦点5。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第13步['hide_all'],当前可用编号[],焦点None。没有可用控件时保留空焦点。
第14步['next'],当前可用编号[],焦点None。没有可用控件时保留空焦点。
第15步['show', 3],当前可用编号[3],焦点3。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第16步['enable', 3],当前可用编号[3],焦点3。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第17步['prev'],当前可用编号[3],焦点3。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第18步['show', 6],当前可用编号[3, 6],焦点3。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第19步['enable', 6],当前可用编号[3, 6],焦点3。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
第20步['next'],当前可用编号[3, 6],焦点6。焦点必须落在可见且启用的控件上,按方向循环跳过其他控件。
所有控件隐藏时能够进入空焦点,重新出现可用控件时再选择有效项,不把空状态当作零号控件。
复核方法和适用范围
独立列出当前所有可用编号,用循环距离找到下一个;如果没有可用项,焦点必须为空。每次状态修改后核对焦点属于可用集合,向前和向后寻址遵守各自方向,而不是固定挑第一个。
这是一套简化界面导航规则,不代替真实应用的完整无障碍规范。弹窗、文本输入内部光标和焦点层级都没有模拟。隐藏与禁用只是影响可用资格的不同标记,不会删除控件本身。
练习时可以只改动一项输入,预测从哪一步开始出现变化,再逐步比较。空状态、数值零和无法判断要分别记录;不要为了让最后结果一致而忽略中途的偏差。边界与同分约定同样属于规则,复核时应一并保留。