带弹出列表的EditText

最近做的一个Andriod里有一个这个要求,一个东西需要输入,但同时可以在列表直接选择。看到这个需求,瞬间想到了QQ的登录界面,那个账号输入的控件正式我所需要的。

clip_image001

clip_image002

这个账号输入框右边有一个按钮,点击可以显示一个下拉列表。

怎么实现呢这个呢,我知道Android里面有一个Spinner,就是下拉列表,但是Spinner没有输入框。如果能把EditText和Spinner合到一起来,恰恰就是我需要的功能。

Google了一阵之后我发现这种需求确实不少,但是最后好多解决方法是使用AutoCompleteTextView。这是一个支持自动补全的输入框,输入的同时会显示一个匹配当前输入做前缀的列表。作为一个半路出家的Android程序员,当时确实眼前一亮(-_-||)。但是这个AutoCompleteTextView有一个缺点,就是要有输入才会有提示列表,可以重载它使得不输入也弹出提示列表,后面会把代码贴出来。虽然和需求有一些出入,但是当时没有找到更好的解决方法就这么用了。重载后的代码如下:

package com.maoguangming.test.util;
 import android.content.Context;import android.graphics.Rect;import android.util.AttributeSet;import android.view.KeyEvent;import android.widget.AutoCompleteTextView; 
 public class InstantAutoCompleteTextView extends AutoCompleteTextView { 
 public InstantAutoCompleteTextView(Context context) {super(context); 
 }
 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。

PrFont34Bin0BinSub0Frac0Def1Margin0Margin0Jc1Indent1440Lim0Lim1<EditTextandroid:id="@+id/editText1"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:ems="10"android:drawableRight="@drawable/unfold">
 

 

 

android:drawableRight="@android:drawable/arrow_down_float"

Android系统 图标 arrow_down_float  向下的箭头

 

clip_image001[4]

效果不错。那个小箭头盗用了Android 4.0.3系统库的资源文件(numberpicker_down_normal_holo_light.png)。现在关键是处理点击事件并且弹出一个列表。

关于点击事件,另一个帖子里有一个很巧妙又很简单的方法,就是设置EditText的OnTouchListener,在点击到右边的图标的范围时做相应的操作:

etTest.setOnTouchListener(new 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

String[] list = { "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);
 

 

联合上上面点击按钮的监听时间,功能就完成了,代码如下:

package com.maoguangming.test;
 import android.app.Activity;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.EditText;import android.widget.ListPopupWindow; 
 public class MainActivity extends Activity implements OnTouchListener,OnItemClickListener { 
 private EditText etTest;private ListPopupWindow lpw;private String[] list; 
 
 @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;
 }
}
 

效果如图

clip_image001[6]

转载 http://maoguangming.com/blog/edittext-with-popuplist.html

 

转载于:https://www.cnblogs.com/z_lb/p/3955710.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获取win7时区所有信息

打开命令行工具&#xff1a; tzutil /l# 或者输入到文件中tzutil /l > data.txt 1 # -*- utf-8 -*-2 3 """获取win7所有时区信息&#xff0c;并写入到sql语句中4 5 Usage: python data.py -f data.txt -o data.sql6 """7 8 if __name__ &quo…

linux kill命令信号,Linux kill 命令详解

Linux kill 命令很容易让人产生误解&#xff0c;以为它仅仅就是用来杀死进程的。我们来看一下 man page 对它的解释&#xff1a;kill - send a signal to a process.从官方的解释不难看出&#xff0c;kill 是向进程发送信号的命令。当然我们可以向进程发送一个终止运行的信号&a…

VSTO学习笔记(二)Excel对象模型

原文:VSTO学习笔记&#xff08;二&#xff09;Excel对象模型上一次主要学习了VSTO的发展历史及其历代版本的新特性&#xff0c;概述了VSTO对开发人员的帮助和效率提升。从这次开始&#xff0c;将从VSTO 4.0开始&#xff0c;逐一探讨VSTO开发中方方面面&#xff0c;本人接触VSTO…

zen-coding for notepad++,前端最佳手写代码编辑器

zen-Coding是一款快速编写HTML,CSS&#xff08;或其他格式化语言&#xff09;代码的编辑器插件&#xff0c;这个插件可以用缩写方式完成大量重复的编码工作&#xff0c;是web前端从业者的利器。 zen-Coding插件支持多种编辑器&#xff0c;如UltraEdit&#xff0c;Notepad等。 温…

red hat linux 远程,Red Hat Linux 远程桌面 – 如何设置

远程访问 RHEL 计算机。运行 RHEL 7.3-8.1 的 Linux 计算机的远程桌面。从任何计算机、平板电脑或移动设备进行访问。立即免费试用&#xff01;如果您是在家中或在旅途中工作&#xff0c;则可能需要一段时间才能在办公室或在家中访问台式计算机。如果该桌面恰巧在 Linux 操作系…

通过boundingRectWithSize:options:attributes:context:计算文本尺寸

转&#xff1a;http://blog.csdn.net/jymn_chen/article/details/10949279 之前用Text Kit写Reader的时候&#xff0c;在分页时要计算一段文本的尺寸大小&#xff0c;之前使用了NSString类的sizeWithFont:constrainedToSize:lineBreakMode:方法&#xff0c;但是该方法已经被iOS…

移动后端支持平台Parse将API由Ruby迁移到Go

Charity Majors是移动后端支持平台Parse的工程师。近日&#xff0c;他撰文介绍了他们将API从Ruby迁移到Go的过程。\\2011年&#xff0c;Parse借助Ruby on Rails快速推出了第一个版本。他们用Unicorn作为HTTP服务器&#xff0c;用Capistrano部署代码&#xff0c;用RVM管理环境&a…

linux 虚拟钢琴程序,基于 Linux 与 VS1003 的 MIDI 电子节拍器的设计与实现,为乐器演奏(如钢琴、吉他)...

基于 Linux 与 VS1003 的 MIDI 电子节拍器的设计与实现&#xff0c;为乐器演奏(如钢琴、吉他)2016-08-22 0 0 0 4.0分其他1积分下载如何获取积分&#xff1f;基于 Linux 与 VS1003 的 MIDI 电子节拍器的设计与实现&#xff0c;为乐器演奏(如钢琴、吉他)提供稳定&#xff0c;丰富…

一个从源代码里提取中文字符串的java类

2019独角兽企业重金招聘Python工程师标准>>> 工作中需要优化代码里的中文警示语和异常信息&#xff0c;实在比较多&#xff0c;所以就写了个程序专门从代码里提取中文字符串。 java做的&#xff0c;比较简单&#xff0c;放上来备忘 package com.extractstr.app;impo…

oracle RAC切换归档

&#xff08;转自leshami&#xff09; RAC环境下的归档模式切换与单实例稍有不同&#xff0c;主要是共享存储所产生的差异。在这种情况下&#xff0c;我们可以将RAC数据库切换到非集群状态下&#xff0c;仅仅在一个实例上来实施归档模式切换即可完成RAC数据库的归档模式转换问…

linux启用ipmi服务,使用 ipmitool 实现 Linux 系统下对服务器的 ipmi 管理

简介&#xff1a; IPMI 是一种可扩展的标准&#xff0c;它定义了如何监控硬件和传感器、控制系统部件以及记录重大事件&#xff0c;随着 ipmi 技术在服务器中的应用&#xff0c;利用 ipmi 的众多优势就成为服务器管理特别是集群管理中不可缺少的部分。本文首先介绍了 ipmi 的一…

linux中bc用法英文,使用GNU bc在Linux Shell中进行数学运算

在 shell 中使用 bc 更好地做算数&#xff0c;它是一种用于高级计算的数学语言。大多数 POSIX 系统带有 GNU bc&#xff0c;这是一种任意精度的数字处理语言。它的语法类似于 C&#xff0c;但是它也支持交互式执行语句和处理来自标准输入(stdin)的数据。因此&#xff0c;它通常…

Linux C Socket编程原理及简单实例

部分转自&#xff1a;http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx 1. 什么是TCP/IP、UDP&#xff1f; 2. Socket在哪里呢&#xff1f; 3. Socket是什么呢&#xff1f; 4. 有很多的框架&#xff0c;为什么还在从Socket开始&#xff1f; 5. Linux C…

蜉蝣极客

蜉蝣极客 百科名片 蜉蝣目&#xff08;英文&#xff1a;mayfly&#xff0c;学名&#xff1a;Ephemeroptera&#xff09;通称蜉蝣&#xff0c;具有古老而特殊的性状&#xff0c;是最原始的有翅昆虫。和蜻蜓目可同分为古翅次纲&#xff0c;他们的翅不能折叠。蜉蝣目昆虫体形细长…

解决Web部署 svg/woff/woff2字体 404错误

原文:解决Web部署 svg/woff/woff2字体 404错误问题&#xff1a;最近在IIS上部署web项目的时候&#xff0c;发现浏览器总是报找不到woff、woff2字体的错误。导致浏览器加载字体报404错误&#xff0c;白白消耗了100-200毫秒的加载时间。 原因&#xff1a;因为服务器IIS不认SVG&am…

压缩感知先进——关于稀疏矩阵

前《初识压缩感知Compressive Sensing》中我们已经讲过了压缩感知的作用和基本想法&#xff0c;涉及的领域&#xff0c;本文通过学习陶哲轩对compressive sensing&#xff08;CS&#xff09;的课程&#xff0c;对压缩感知做进一步理解。针对其原理做出解说。本文较为理论性&…

基于环信sdk的陌生人交友php服务器代码开源

2019独角兽企业重金招聘Python工程师标准>>> 这个是代码结构 服务器端需要两个服务器端软件的支持&#xff1a; 1&#xff1a;weed-fs golang写的海量小文件存储工具 2&#xff1a;memcache 流行的缓存服务器 服务器端主要配置是 conf.php 文件&#xff0c;配置数据…

Linux视频 pad,Wine 1.9.10 发布下载, 改善视频输出

Wine 1.9.10最近发布下载&#xff0c;改进了大量的新功能和错误修正。一个显著的更新是此版本改善视频输出&#xff0c;更兼容目录列表&#xff0c;修复一些C 运行时。Wine 1.9.10 Bug 修复Month calendar control uses 0sunday for firstDayOfWeektooltips not working proper…

EXCEL数据导入dataset

一、开工必备 1、micorosoft office2007 2、VS2010、Oracle 11 二、界面 三、内部代码 (1)获取数据库连接&#xff0c;定义全局变量 private static string connString System.Configuration.ConfigurationSettings.AppSettings[ "connStr" ]; D…

JDBC连接MySQL数据库及演示样例

JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术。 一、JDBC基础知识 JDBC&#xff08;Java Data Base Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;能够为多种关系数据库提供统一訪问&#xff0c;它由一组用Java语言…