当TextInput
窗口没有焦点时,我需要从Adobe Air
移除焦点。但我找不到正常的方法来做到这一点。
以下是一个示例应用:
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
>
<fx:Script>
<![CDATA[
protected function onFocusIn(event:FocusEvent):void{
input.appendText('I');
}
protected function onFocusOut(event:FocusEvent):void{
input.appendText('o');
// input.focusManager.deactivate();
// stage.focus = null;
// focusManager.setFocus(input2);
// stage.focus = stage;
}
]]>
</fx:Script>
<s:VGroup>
<s:TextInput id="input" focusIn="onFocusIn(event)" focusOut="onFocusOut(event)" />
<s:TextInput id="input2" />
</s:VGroup>
stage.focus = null
不起作用 - 当窗口没有焦点时,stage.focus
已经null
,因此无效。
input.focusManager.deativate()
可以解决问题,但似乎这个管理器用于其他控件,所以这不是一个好选择。在文档中说
如果更多,SystemManager将激活和取消激活FocusManager 只有一个IFocusManagerContainer可以同时显示。
但是在这个示例应用程序中我有两个TextInputs,当我为第一个停用focusManager时,第二个不再将焦点恢复到alt-tab上。
我可以将焦点设置为其他东西,但创建特殊的“虚拟”输入是某种猴子补丁,我宁愿避免使用它,直到它不可避免。
将stage.focus
设置为TextInput的某个父级也没有任何效果。
那么,你知道在窗口没有焦点的情况下从组件中移除焦点的更好方法吗?
答案 0 :(得分:4)
好的,我找到了满足我的解决方案:
FocusManager(focusManager).mx_internal::lastFocus = null;
它不完美,因为它使用mx_internal命名空间属性,可以在将来的sdk版本中进行更改。
此解决方案有效,因为FocusManager在Windows激活时恢复了焦点(带有注释掉行的漂亮代码......):
private function activateWindowHandler(event:Event):void
{
// var target:InteractiveObject = InteractiveObject(event.target);
// trace("FM " + this + " activateWindowHandler ", _lastFocus);
windowActivated = true;
if (activated)
{
dispatchEvent(new FlexEvent(FlexEvent.FLEX_WINDOW_ACTIVATE));
// restore focus if this focus manager had last focus
if (_lastFocus && !browserMode)
_lastFocus.setFocus();
lastAction = "ACTIVATE";
}
}
不幸的是,它不是focusIn
处理程序堆栈跟踪的一部分,因此需要时间来查找谁正在恢复对Windows激活的关注。