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

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

怎么实现呢这个呢,我知道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  向下的箭头

效果不错。那个小箭头盗用了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;

 }
}

效果如图

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

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

带弹出列表的EditText相关推荐

  1. 在写新邮件时,在地址栏中敲入前几个字母,对于已熟悉的收件人,outlook会弹出列表...

    在写新邮件时,在地址栏中敲入前几个字母,对于已熟悉的收件人,outlook会弹出列表 这些outlook已经熟悉的收件人列表,储存在哪里? 详见下图 问题一已解决,相关内容存储在如下文件中 \Docu ...

  2. aardio - 使用customPlus库制作弹出列表

    customPlus库非常强大,但是很多人可能不会用. 下面演示如何使用customPlus库制作弹出列表: 效果一: 代码一: import win.ui; import fonts.fontAwe ...

  3. K3Cloud BOS设计 Python 插件 弹出列表

    K3Cloud BOS设计 Python 插件 弹出列表并筛选 C#插件参照 下载 添加文本控件 表单插件 1.Python 插件脚本 1. 写窗体回调函数 2. 封装弹出窗体函数 3. 重写Befo ...

  4. vant-Weapp实现省市区三级联动顶部弹出列表

    准备:利用vant weapp做的顶部弹出的省市区三级联动对话框 1.下载区域:arrea.js,放到utils备用 // 三级联动省市区 export default {province_list: ...

  5. Android仿IOS封装通用的弹出框Dialog和底部弹出列表选择框 仿美团顶部条件筛选框 附自定义ViewGroup

    弹出框 背景 提示与询问弹出框 实现 使用 列表选择框 实现 使用 顶部条件筛选框 实现 自定义ViewGroup 使用 总结 背景 鉴于Android提供的默认弹出框很一般,IOS的弹出框样式还不错 ...

  6. 【Chapter1】微信自带弹出框

    文章目录 一.简介 二.弹出框 1.提示框 1.1 显示提示框 1.2 加载提示框 2.是否选择框 3.多项选择框 三.嵌套 四.遇到的问题 最近用了一周写了一个仿知乎的小程序,将会陆续整理,包括前端 ...

  7. 菜单样式1:鼠标悬停向下弹出列表

    JS部分: var qcloud={}; $('[_t_nav]').hover(function(){ var _nav = $(this).attr('_t_nav'); clearTimeout ...

  8. DELPHI XE5-8 弹出列表框供选择

    点击章节练习:vartmplm:Tlistboxitem; begindm.FDQTMP.SQL.Clear;dm.FDQTMP.SQL.Add('select GSESSON from TSques ...

  9. html选择弹出列表实例,CSS3制作炫酷的下拉菜单及弹起式选单的实例分享

    下拉菜单先直接来看效果是怎样: 当鼠标移到选单之后,下方会展开并有其它说明内容,我这边是把展开的部份加上图片内容,让它有其它不同的变化.因为这样的动作就像人家庙会时会有舞狮从嘴里丢下贺联一样,所以我才 ...

最新文章

  1. 使用pytorch搭建 RNN线性神经网络
  2. 带你揭秘Web前端发展的前景以及技术
  3. js时间戳格式化成日期格式
  4. python 代理的使用
  5. linux基础系统命令大全
  6. Nginx的异步非阻塞
  7. echarts定时加载动画数据
  8. Git之提示There is no tracking information for the current branch.
  9. 在Eclipse中使用SDK中的@hide函数
  10. 安卓手机安装并使用自动化应用Tasker
  11. 程序员恶搞图片===爆笑中......娱乐一下.....
  12. 万恶的单线程!!怎样才能实现一个真正的多线程的php socket server啊!!!
  13. 【Tensor】(张量)的基本概念和操作
  14. su组件在什么窗口,【答疑】草图大师Sketchup组件窗口快捷键是什么呢? - 羽兔网问答...
  15. 真是恍然大悟啊!腾讯、网易必问的20道题Android面试题,架构师必备技能
  16. LDAP、OLAP、OLTP详细介绍
  17. 迷宫问题的求解(广度和深度优先搜索)
  18. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)
  19. 爬虫信息后ocr识别
  20. transform matrix3d

热门文章

  1. 【HDU - 2066】:一个人的旅行(Dijkstra算法)
  2. Apollo进阶课程㊵丨Azure仿真平台使用
  3. Apollo自动驾驶入门课程第⑨讲 — 控制(上)
  4. linux i2c触摸屏驱动程序,触摸屏i2c设备和驱动的创建流程及方法
  5. java 单例 饿汉式_Java-单例设计模式(懒汉与饿汉)
  6. robolectric android studio,Android Studio + Robolectric + AndroidAnnotations 根本框架
  7. 快速幂实现pow函数(从二分和二进制两种角度理解快速幂)
  8. redis——缓存击穿/穿透/雪崩
  9. python学习实例(3)
  10. ncnn网络框架使用指南