文档章节

Flex文本框自动提示(AutoSuggest)、自动完成(AutoComplete)

ruyees
 ruyees
发布于 2014/10/05 11:47
字数 838
阅读 143
收藏 0

做一个小程序要用到Flex文本框自动提示的功能,因为时间不是很紧,所以决定自己动手做这个小组件,花了一个晚上的时间终于完成了。贴出来与大家分享一下。

  虽然网上有不少这样的组件,但自己动手做可以锻炼下思维及动手能力,且老吃现成饭,总感觉不是很爽……废话少说,进入正题。

  组件运行时截图

Flex文本框自动提示(AutoSuggest)、自动完成(AutoComplete)

  设计思路

  思路比较简单,组件分成两个部分,1文本框;2提示的下拉列表;

  自动提示:

  在文本框中输入文字时,在数据源(所有的提示项)查找匹配的选项,若匹配的选项数量>0,在文本框下方显示下拉列表供用户选择;

  自动补全:

  在匹配的选项中选择最合适的一项(通常为第一项),与用户输入做对比,将用户未完成输入的字符补全到文本框中去,并将补全部分字符设置为选中状态;(为什么要处于选中状态,假如补全文字不是用户所需要的,用户只要再往下输文字就可以了,而不用手动删除补上去的文字)

  代码实现(关键点)

  1. 界面的制作,文本框+下拉列表,是不是让人马上联想到了下拉列表框;为了简单起见,我便把Flex中的Combox“伪装”成TextInput,代码如下:

 1private function init(){
    editable=true;
    rowCount=5;
     selectedIndex=-1;

     isTextBoxStringChange=false;
     isfocusInDropDown=false;
     isAutoComplete=false;
     //伪装成TextBox
     setStyle("cornerRadius",0);
     setStyle("arrowButtonWidth",0);
     setStyle("fontWeight","normal");
     setStyle("paddingLeft",0);                    
   }

 

因为ComboBox的长度要比TextInput 宽,也要进行处理一下:

 

 

/** *//**
* 与TextBox同样的宽度
*/ 
override protected function measure():void
{
          super.measure();
          measuredWidth=UIComponent.DEFAULT_MEASURED_WIDTH;    
}

  

 

2. 当文本发生变化时,触发查找匹配项的方法,重写父类的textInput_changeHandler(event:Event)事件。

 /** *//**
 * 文本发生变化时
 */ 
 override protected function textInput_changeHandler(event:Event):void
 {
             if(textInput.text == ""){
                 isTextBoxStringChange=false;
             }
             else{            
                isTextBoxStringChange=true;
            }
            super.textInput_changeHandler(event);
            invalidateProperties();//调用该方法,随后会触发调用commitProperties()
}

 

 

3.进行匹配项的查找,假如控件指定了要进行自动补全则进行自动补全操作。

 override protected function commitProperties():void{
             if(isTextBoxStringChange){
                 prompt=text;
                 filter();                            //进行匹配项的查找
                 if(isAutoComplete&&!isBackSpaceKeyDown){
                     var autoCompleteString:String="";
                     if(dataProvider.length>0)
                     {
                      autoCompleteString=itemToLabel(dataProvider[0]);
                      textInput.setSelection(prompt.length,autoCompleteString.length);
                        prompt=autoCompleteString;                                                    
                    }    
                    else{
                        textInput.setSelection(textInput.selectionEndIndex,textInput.selectionEndIndex);
                    }
                }
                else{
                    textInput.setSelection(textInput.selectionEndIndex,textInput.selectionEndIndex);    
                }
            }                
            super.commitProperties();
}

 

 

4。检查匹配项的数量若不为0,则显示下拉列表,供用户参考选择。

 /** *//**
 * 数据源发生变化,数据不为0弹出下拉列表
 */ 
 override protected function collectionChangeHandler(event:Event):void
 {
             super.collectionChangeHandler(event);
             if(dataProvider.length>0)
             {
                 open();
            }
}

  难点、易出问题点

  1,输入文本框的文字显示不出来,因为系统默认将光标一直放在第一个位置,造成用户输入的文字被取消掉,所以在即使不需要补全是,也要进行textInput.setSelection的操作,如下:

  textInput.setSelection(textInput.selectionEndIndex,textInput.selectionEndIndex);//这一句不是多余的

  2,退格键不起作用,专门为退格键按下作一个FLAG,进行特殊的处理

 /** *//**
 * 处理退格键按下的情况
 */     
 override protected function keyDownHandler(event:KeyboardEvent):void
 {
             if(!event.ctrlKey&&!event.shiftKey)
             {
                 if(event.keyCode == Keyboard.BACKSPACE)
                 {
                    close();
                    isBackSpaceKeyDown=true;
                }
                else
                {
                    isBackSpaceKeyDown=false;
                }
                //当按UP键向上选择时,到达最顶时,显示用户原来所需文字
                if(event.keyCode == Keyboard.UP && selectedIndex==0)
                {
                    selectedIndex=-1;
                }                                
            }
            super.keyDownHandler(event);
}

 

 

本文转载自:http://zuoqiang.iteye.com/blog/777226

共有 人打赏支持
ruyees
粉丝 3
博文 71
码字总数 0
作品 0
深圳
产品经理
私信 提问
5分钟吃透React Native Flexbox

今天我们来聊聊Flexbox,它是前端的一个布局方式。在React Native中是主流布局方式。如果你刚刚入门React Native,或者没有多少前端的技术经验,亦或者对其半知半解,那么这篇文章将很好的帮...

idisfkj
2018/08/28
0
0
从零开始学 Web 之 CSS3(七)多列布局,伸缩布局

大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http://www.cnblogs.com/lvonve/ CSDN...

Daotin
2018/08/06
0
0
进一步了解flex布局—来实现这些常见布局吧

  flex布局具有便捷、灵活的特点,熟练的运用flex布局能解决大部分布局问题,这里对一些常用布局场景做一些总结。 web页面布局(topbar + main + footbar) 示例代码   要实现的效果如下:...

LT_bear
2018/05/29
0
0
将 Flex 集成到 Java EE 应用程序的最佳实践

传统的 Java EE 应用程序通常使用某种 MVC 框架(例如,Struts)作为前端用户界面,随着 Flex 的兴起,基于 RIA 的客户端能够给用户带来更酷的界面,更短的响应时间,以及更接近于桌面应用程...

小编辑
2010/01/05
1K
1
FABridge 配置 (js与as通信)

[使用flash builder 4 点击工程-->右键-->创建Ajax Bridge 添加支持] 在开始使用 FABridge 之前,下面提供了可以使用的资料和开发环境。下载最新的 Flex SDK 后,请配置清单 2 中所示的目录结...

SeanCai
2011/03/29
0
1

没有更多内容

加载失败,请刷新页面

加载更多

如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
今天
2
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
今天
4
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxCool
今天
3
0
携程Apollo统一配置中心的搭建和使用(java)

一.Apollo配置中心介绍 1、What is Apollo 1.1 Apollo简介 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到...

morpheusWB
今天
3
0
远程获得的有趣的linux命令

使用这些工具从远程了解天气、阅读资料等。 我们即将结束为期 24 天的 Linux 命令行玩具日历。希望你有一直在看,如果没有,请回到开始,从头看过来。你会发现 Linux 终端有很多游戏、消遣和...

Linux就该这么学
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部