带弹出列表的EditText
最近做的一个Andriod里有一个这个要求,一个东西需要输入,但同时可以在列表直接选择。看到这个需求,瞬间想到了QQ的登录界面,那个账号输入的控件正式我所需要的。
这个账号输入框右边有一个按钮,点击可以显示一个下拉列表。
怎么实现呢这个呢,我知道Android里面有一个Spinner,就是下拉列表,但是Spinner没有输入框。如果能把EditText和Spinner合到一起来,恰恰就是我需要的功能。
Google了一阵之后我发现这种需求确实不少,但是最后好多解决方法是使用AutoCompleteTextView。这是一个支持自动补全的输入框,输入的同时会显示一个匹配当前输入做前缀的列表。作为一个半路出家的Android程序员,当时确实眼前一亮(-_-||)。但是这个AutoCompleteTextView有一个缺点,就是要有输入才会有提示列表,可以重载它使得不输入也弹出提示列表,后面会把代码贴出来。虽然和需求有一些出入,但是当时没有找到更好的解决方法就这么用了。重载后的代码如下:
}
public InstantAutoCompleteTextView(Context context, AttributeSet attrs) {super(context, attrs);
}
public InstantAutoCompleteTextView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle);
}
@Override
public boolean enoughToFilter() {return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction,Rect previouslyFocusedRect) {super.onFocusChanged(focused, direction, previouslyFocusedRect);if (focused && getAdapter() != null) {performFiltering(getText(), KeyEvent.KEYCODE_UNKNOWN);
}
}
}
在使用了一段时间之后我发现这个AutoCompleteTextView之后,我发现在我这个场景下体验不是很好,尤其是程序横屏的时候,输入框在输入时会默认全屏,这个时候就看不到提示列表了,可以调整参数使得输入法不全屏,但是半屏显示输入法,一来列表显示的地方不大,二来和其他的输入框风格不一。另外列表是经过筛选过的,如果在输入过程中想直接选择列表中的值,选择范围只有一部分。种种原因,最终我决定重新开始找解决方案。
由于将Spinner和EditText结合以来上次都找过,我决定先在EditText右边添加一个类似QQ账号输入框的小箭头。果然在Stack Overflow上找到了很多解决方案,最终我用的方法是直接在layout里设置EditText的drawableRight。
android:drawableRight="@android:drawable/arrow_down_float"
Android系统 图标 arrow_down_float 向下的箭头
效果不错。那个小箭头盗用了Android 4.0.3系统库的资源文件(numberpicker_down_normal_holo_light.png)。现在关键是处理点击事件并且弹出一个列表。
关于点击事件,另一个帖子里有一个很巧妙又很简单的方法,就是设置EditText的OnTouchListener,在点击到右边的图标的范围时做相应的操作:
@Override
public boolean onTouch(View v, MotionEvent event) {final int DRAWABLE_LEFT = 0;final int DRAWABLE_TOP = 1;final int DRAWABLE_RIGHT = 2;final int DRAWABLE_BOTTOM = 3; // Check if touch point is in the area of the right buttonif(event.getAction() == MotionEvent.ACTION_UP) {if(event.getX() >= (etTest.getWidth() - etTest.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {// your action herereturn true;
}
}
return false;
}
});
最后一步就是显示列表了,不买关子了,最后使用了ListPopupWindow
联合上上面点击按钮的监听时间,功能就完成了,代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); etTest = (EditText) findViewById(R.id.et_test);etTest.setOnTouchListener(this); list = new String[] { "item1", "item2", "item3", "item4" };lpw = new ListPopupWindow(this);lpw.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, list));lpw.setAnchorView(etTest);lpw.setModal(true);lpw.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {String item = list[position];etTest.setText(item);lpw.dismiss();
}
@Override
public boolean onTouch(View v, MotionEvent event) {final int DRAWABLE_RIGHT = 2; if (event.getAction() == MotionEvent.ACTION_UP) {if (event.getX() >= (v.getWidth() - ((EditText) v) .getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {lpw.show();return true;
}
}
return false;
}
}
效果如图
转载 http://maoguangming.com/blog/edittext-with-popuplist.html
转载于:https://www.cnblogs.com/z_lb/p/3955710.html
带弹出列表的EditText相关推荐
- 在写新邮件时,在地址栏中敲入前几个字母,对于已熟悉的收件人,outlook会弹出列表...
在写新邮件时,在地址栏中敲入前几个字母,对于已熟悉的收件人,outlook会弹出列表 这些outlook已经熟悉的收件人列表,储存在哪里? 详见下图 问题一已解决,相关内容存储在如下文件中 \Docu ...
- aardio - 使用customPlus库制作弹出列表
customPlus库非常强大,但是很多人可能不会用. 下面演示如何使用customPlus库制作弹出列表: 效果一: 代码一: import win.ui; import fonts.fontAwe ...
- K3Cloud BOS设计 Python 插件 弹出列表
K3Cloud BOS设计 Python 插件 弹出列表并筛选 C#插件参照 下载 添加文本控件 表单插件 1.Python 插件脚本 1. 写窗体回调函数 2. 封装弹出窗体函数 3. 重写Befo ...
- vant-Weapp实现省市区三级联动顶部弹出列表
准备:利用vant weapp做的顶部弹出的省市区三级联动对话框 1.下载区域:arrea.js,放到utils备用 // 三级联动省市区 export default {province_list: ...
- Android仿IOS封装通用的弹出框Dialog和底部弹出列表选择框 仿美团顶部条件筛选框 附自定义ViewGroup
弹出框 背景 提示与询问弹出框 实现 使用 列表选择框 实现 使用 顶部条件筛选框 实现 自定义ViewGroup 使用 总结 背景 鉴于Android提供的默认弹出框很一般,IOS的弹出框样式还不错 ...
- 【Chapter1】微信自带弹出框
文章目录 一.简介 二.弹出框 1.提示框 1.1 显示提示框 1.2 加载提示框 2.是否选择框 3.多项选择框 三.嵌套 四.遇到的问题 最近用了一周写了一个仿知乎的小程序,将会陆续整理,包括前端 ...
- 菜单样式1:鼠标悬停向下弹出列表
JS部分: var qcloud={}; $('[_t_nav]').hover(function(){ var _nav = $(this).attr('_t_nav'); clearTimeout ...
- DELPHI XE5-8 弹出列表框供选择
点击章节练习:vartmplm:Tlistboxitem; begindm.FDQTMP.SQL.Clear;dm.FDQTMP.SQL.Add('select GSESSON from TSques ...
- html选择弹出列表实例,CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
下拉菜单先直接来看效果是怎样: 当鼠标移到选单之后,下方会展开并有其它说明内容,我这边是把展开的部份加上图片内容,让它有其它不同的变化.因为这样的动作就像人家庙会时会有舞狮从嘴里丢下贺联一样,所以我才 ...
最新文章
- 使用pytorch搭建 RNN线性神经网络
- 带你揭秘Web前端发展的前景以及技术
- js时间戳格式化成日期格式
- python 代理的使用
- linux基础系统命令大全
- Nginx的异步非阻塞
- echarts定时加载动画数据
- Git之提示There is no tracking information for the current branch.
- 在Eclipse中使用SDK中的@hide函数
- 安卓手机安装并使用自动化应用Tasker
- 程序员恶搞图片===爆笑中......娱乐一下.....
- 万恶的单线程!!怎样才能实现一个真正的多线程的php socket server啊!!!
- 【Tensor】(张量)的基本概念和操作
- su组件在什么窗口,【答疑】草图大师Sketchup组件窗口快捷键是什么呢? - 羽兔网问答...
- 真是恍然大悟啊!腾讯、网易必问的20道题Android面试题,架构师必备技能
- LDAP、OLAP、OLTP详细介绍
- 迷宫问题的求解(广度和深度优先搜索)
- 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)
- 爬虫信息后ocr识别
- transform matrix3d
热门文章
- 【HDU - 2066】:一个人的旅行(Dijkstra算法)
- Apollo进阶课程㊵丨Azure仿真平台使用
- Apollo自动驾驶入门课程第⑨讲 — 控制(上)
- linux i2c触摸屏驱动程序,触摸屏i2c设备和驱动的创建流程及方法
- java 单例 饿汉式_Java-单例设计模式(懒汉与饿汉)
- robolectric android studio,Android Studio + Robolectric + AndroidAnnotations 根本框架
- 快速幂实现pow函数(从二分和二进制两种角度理解快速幂)
- redis——缓存击穿/穿透/雪崩
- python学习实例(3)
- ncnn网络框架使用指南