Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 带有默认移动皮肤的Flex TextInput自动恢复对调用关闭的关注_Actionscript 3_Apache Flex_Mobile_Flex4_Textinput - Fatal编程技术网

Actionscript 3 带有默认移动皮肤的Flex TextInput自动恢复对调用关闭的关注

Actionscript 3 带有默认移动皮肤的Flex TextInput自动恢复对调用关闭的关注,actionscript-3,apache-flex,mobile,flex4,textinput,Actionscript 3,Apache Flex,Mobile,Flex4,Textinput,我正在为我的Flex移动应用程序开发一个简单的自动完成功能。为此,我有一个调用按钮,可以触发调用。 详图索引包含一些列表,用户可以从中选择项目。在选择项时,调用将关闭(calloutButton.closeDropDown()) 对于TextInput,也会执行相同的行为。用户输入文本,详图索引打开,列表根据输入的文本进行更改。到目前为止效果很好。现在,当用户从任何列表中选择项目时,调用将关闭。也很好。 现在的问题是,在标注关闭后,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焦点问题)

  • 在文本输入中输入文本
  • 更改键时,将打开带有两个列表的详图索引
  • 第一个列表根据从Web服务输入的文本接收结果
  • 用户从列表中选择项目
  • 第二个列表根据来自webservice的第一个列表的选择接收结果
  • 用户选择第二个列表中的项目
  • 调用关闭
这一切都可以正常工作,除了文本输入在调用关闭后接收焦点。 我真的不知道是什么触发了这种行为

Edit2:进一步说明该问题的代码。 当然,这是非常基本的,但它反映了组件和焦点的行为

首先是Callout按钮和TextInput,它们都可以控制Callout:

<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");          
}