Actionscript 3 带有默认移动皮肤的Flex TextInput自动恢复对调用关闭的关注
我正在为我的Flex移动应用程序开发一个简单的自动完成功能。为此,我有一个调用按钮,可以触发调用。 详图索引包含一些列表,用户可以从中选择项目。在选择项时,调用将关闭(calloutButton.closeDropDown()) 对于TextInput,也会执行相同的行为。用户输入文本,详图索引打开,列表根据输入的文本进行更改。到目前为止效果很好。现在,当用户从任何列表中选择项目时,调用将关闭。也很好。 现在的问题是,在标注关闭后,TextInput会自动恢复焦点 在移动设备上,这不仅仅是令人不安 我将此行为缩小到了mobile TextInput皮肤(spark.skins.mobile.TextInputSkin),因为没有此皮肤类的TextInput不会显示此行为 现在你可能会说只使用默认皮肤,但不幸的是我不能。默认皮肤有一个Android设备的bug,无法通过enter事件。我可以接受,因为我不一定依赖于enter事件,但是,spark mobile skin允许be在文本输入中继续输入文本,即使在调用被打开之后也是如此,这是非常需要的,因为列表会根据输入的文本进行更改 我不能提供任何代码,因为问题已经缩小到skinClass,因此不应该出现在我自己的代码中。相信我,我尝试了每一种好的和不太好的方法来防止TextInput再次获得焦点,但是没有任何效果 所以,完全被困在这里了! 希望你们对如何解决这个问题有一些想法 编辑: 下面是我的应用程序行为的步骤。(公平地说,调用中的工作流程稍微复杂一些,我在这里使用了几个列表和一个SplitViewNavigator(因此无法使用Flextras自动完成),但这不会影响我面临的TextInput焦点问题)Actionscript 3 带有默认移动皮肤的Flex TextInput自动恢复对调用关闭的关注,actionscript-3,apache-flex,mobile,flex4,textinput,Actionscript 3,Apache Flex,Mobile,Flex4,Textinput,我正在为我的Flex移动应用程序开发一个简单的自动完成功能。为此,我有一个调用按钮,可以触发调用。 详图索引包含一些列表,用户可以从中选择项目。在选择项时,调用将关闭(calloutButton.closeDropDown()) 对于TextInput,也会执行相同的行为。用户输入文本,详图索引打开,列表根据输入的文本进行更改。到目前为止效果很好。现在,当用户从任何列表中选择项目时,调用将关闭。也很好。 现在的问题是,在标注关闭后,TextInput会自动恢复焦点 在移动设备上,这不仅仅是令人不
- 在文本输入中输入文本
- 更改键时,将打开带有两个列表的详图索引
- 第一个列表根据从Web服务输入的文本接收结果
- 用户从列表中选择项目
- 第二个列表根据来自webservice的第一个列表的选择接收结果
- 用户选择第二个列表中的项目
- 调用关闭
<ui:SearchCallout id="detailSearch"/>
<s:TextInput id="searchInput" skinClass="spark.skins.mobile.TextInputSkin"
enter="historySearch(searchInput.text)"
focusOut="searchFocusOutEvent(event)"
focusIn="searchFocusInEvent(event)"/>
注意:“val”(TextInput的文本)会被修剪等等,最终会生成一个字符串数组,用“_searchSyms”表示
其他EventListener如下所示:
searchInput.addEventListener(KeyboardEvent.KEY_DOWN, onKeyEvent);
searchInput.addEventListener(FlexEvent.VALUE_COMMIT, onKeyEvent);
searchInput.addEventListener(TextOperationEvent.CHANGE, onTextChange);
KEY\u DOWN和VALUE\u COMMIT与调用没有任何关系,它们用于处理searchHistory的内容,因此我将把onKeyEvent函数留在这里
ContextChange触发服务器上的字符串搜索,并在TextInput的文本为空字符串时关闭调用:
private function onTextChange(event:Event):void {
if(searchInput.text=="") {
if(detailSearch.isDropDownOpen) {
(detailSearch.rightView.activeView as RightView).clearDetailList();
detailSearch.isCloseable=true;
}
}
_searchManager.getRicsByChar(searchInput.text);
}
最终,服务器将响应并传递一组响应。调用被打开,它的列表中充满了响应
我不会在这里粘贴所有标注内容的代码,因为这会太多。基本上,用户从任何列表中选择一个项目,强制关闭调用,并将值传递给组件的搜索功能(此处尚未粘贴,请耐心等待;)给出该项目的值。基本上看起来是这样的(不要管FlexGlobals的东西,一旦焦点问题得到解决,就会对其进行重构):
好了,现在是整个功能的最后一步,searchEvent。如前所述,此函数基本上只将格式化的搜索值传递给所选组件。这可能发生在文本输入的“回车”时(如上面的代码所示),也可能发生在从调用列表中选择项目时
public function searchEvent(_searchSymbols:Array, setText:Boolean):void {
if(setText) {
var _searchString:String="";
for each (var _sym:String in _searchSymbols) {
_searchString += _sym + ", ";
}
searchInput.text = _searchString.substring(0, _searchString.length-2);
}
stage.focus=null;
if(selectedWindowContainer) {
// set the array of search items to the selected component here
selectedWindowContainer.setFocus();
} else
trace("[MAIN] no component selected");
}
基本上就是这样。此函数是我的搜索例程的最后一步,所选组件(将获取搜索项目)正在获取焦点。
但是,它会自动再次失去焦点,TextInput将接收到它。我不知道这在哪里发生,为什么会发生,我需要尽快摆脱这种行为
哇,多棒的帖子,还有人在读吗?;)嗯,我希望如此 好吧,在几个小时的测试之后,我(有点)解决了这个问题,尽管我认为这是一个比其他任何东西都更肮脏的黑客行为 将TextInput的focusEnabled设置为false可以很好地工作,即使焦点指示(TextInput周围的边框)不再适用于此(我现在可以接受这个问题)
尽管如此,我还是很想知道这里到底发生了什么,特别是在移动皮肤课程中。我不完全理解。一些代码,或者可能是一个屏幕广播会在这里有所帮助。[我可以自私自利地说,也可以看看Flextras Mobile AutoComplete。如果它能满足您的需要,与从头开始构建相比,它将为您节省大量时间]我已经查看了您的AutoComplete组件,但是它没有提供我需要的功能。我将编辑第一篇文章来进一步说明这个问题。我仍然认为截图可以帮助我(可能还有其他人)理解。听起来你好像有一些级联列表;其中,根据第一个列表中选择的数据填充一个列表。在标注关闭后,您希望焦点是什么?这正是我所拥有的。我的应用程序中有自定义组件(一个视图中有多个),必须在详图索引关闭后选择这些组件。在我的例行程序(选择)中,我已经设置了他们的焦点
var search:String = String(event.currentTarget.selectedItem);
FlexGlobals.topLevelApplication.detailSearch.forceClose=true;
FlexGlobals.topLevelApplication.detailSearch.closeDropDown();
FlexGlobals.topLevelApplication.searchEvent(new Array(search), true);
public function searchEvent(_searchSymbols:Array, setText:Boolean):void {
if(setText) {
var _searchString:String="";
for each (var _sym:String in _searchSymbols) {
_searchString += _sym + ", ";
}
searchInput.text = _searchString.substring(0, _searchString.length-2);
}
stage.focus=null;
if(selectedWindowContainer) {
// set the array of search items to the selected component here
selectedWindowContainer.setFocus();
} else
trace("[MAIN] no component selected");
}