带弹出列表的EditText

最近做的一个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

时间: 2024-11-05 05:32:06

带弹出列表的EditText的相关文章

iOS开发——UI篇&amp;下拉弹出列表选择项效果

下拉弹出列表选择项效果 右边菜单中的按键,点击弹出一个列表可选择,选择其中一个,响应相应的事件并把文字显示在右边的菜单上:弹出下拉效果使用LMDropdownView插件,可以用POD进行加载pod ‘LMDropdownView’:LMDropdownView是把想要的视图赋给它: 源代码地址:https://github.com/JxbSir/YiYuanYunGou 效果如下: 1:在主页面先定义按键跟绑定视图(没写全的都是属性中定义了比如btnRigth,dropdownView等):

OpenERP-隐藏多对多域弹出列表视图的&quot;新建&quot;按钮(Hide the &quot;Create&quot; button from the popup list view of a many2many field)

隐藏多对多域的弹出列表视图中的"新建"按钮,如例: Hiding the "Create" button from the popup list view of a many2many field. Example shown as below: 1. 在.py文件中定义many2many的field: 1. Define a many2many field in the python source file 'a_m2m_field': fields.many2m

嫌弃浏览器自带弹出框,写个简单的jq自定义弹窗插件

最近做项目写个表单验证,提交信息验证有错误的时候,用了最懒的方法,直接把错误提示用alert()弹出框弹出来,于是老大看完后给了这个表情... 确实,自带弹窗样式丑不能自定义这些问题困扰着很多用户,而且在同浏览器有不同的表现, 有这样的:.. 有这样的:.. 还有这样的:.. 还有这样的: 相信做前端的都很熟悉这些面孔~ 不统一风格的弹窗直接拉低了整个网站的逼格.. 好,那就写个简单的JQ插件来装饰一下吧. JQ插件标准的封装代码如下,首先需要闭包: <script type="text/

Delphi自己隐藏自定义弹出列表

先上代码 procedure TForm3.Timer1Timer(Sender: TObject); var Point: TPoint; Name: array[0..255] of Char; Buffer: array[0..1023] of Char; AHandle: THandle; begin //取得鼠标位置 GetCursorPos(Point); //取得当前窗口句柄 AHandle := WindowFromPoint(Point); if (AHandle<>LabE

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

点击章节练习: var tmplm:Tlistboxitem; begin dm.FDQTMP.SQL.Clear; dm.FDQTMP.SQL.Add('select GSESSON from TSquestions where GLESSON=:ggl group by GSESSON'); dm.FDQTMP.Params.ParamByName('ggl').Value:=Qlesson; dm.FDQTMP.Open; dm.FDQTMP.First; ListBoxSesson.It

ionicPopup弹出列表选择对话框

//显示vm.selectWarehouse = function() { vm.popupForWarehouse = $ionicPopup.show({ template: '<div class="list"> '+ ' <ion-item ng-repeat="item in warehouselist" ng-click="vm.selectWarehouse1(item)" class="item ite

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

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

取消 EditText 自动聚焦弹出输入法界面

方法一(实测可行): 参考http://www.cnblogs.com/dream-cichan/p/aaaa.html 当我点击跳转至一个带有EditText的界面后,模拟器中的软键盘会自动弹出,严重影响了用户体验.在网上找了资料,现总结如下. 我们知道,EditText有一个 android:focusable=""的属性,但是如果你在edittext中直接将这个属性设置为true的话,点进去软键盘确实不会再弹出,但是EditText相应的也失去了聚焦,即无论你怎么点击它都不会有反

关于项目中很多键盘无故弹出或无隐藏的总结

1.activity的键盘问题 当布局中有EditText时,键盘有时会主动弹出影响界面效果,解决方式如下: 在清单文件-Manifest.xml中设定activity的属性 1.键盘的隐藏 android:windowSoftInputMode="stateHidden|stateUnchanged" "stateUnspecified"是指软键盘的状态(是否它是隐藏或可见)没有被指定. "stateHidden" 当用户选择该Activity