Android EditText+ListPopupWindow实现可编辑的下拉列表

使用场景

AutoCompleteEditText只有开始输入并且与输入的字符有匹配的时候才弹出下拉列表.Spinner的缺点是不可以编辑.所以本文介绍如何使用EditText+ListPopupWindow实现可编辑的下拉列表.使用场景可以是有记住密码功能的登录框.

给EditText增加上下箭头

我们需要一个箭头图片,放在EditText的右面,用来点击后弹出下拉列表.如图所示

要想实现这个很容易,只需要在布局文件中给EditText设置一个drawableRight的属性.

<EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableRight="@drawable/pull_down1"/>

如何在点击的时候切换箭头的方向

切换箭头的上下方向,实际上就是重新设置EditText的drawableRight.这就需要动态的设置EditText的drawableRight.

setCompoundDrawables(left, top, right, bottom);
setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom);

意思是设置Drawable显示在text的左、上、右、下位置。

但是两者有些区别: 
setCompoundDrawables 画的drawable的宽高是按drawable.setBound()设置的宽高,所以才有The Drawables must already have had setBounds(Rect) called.意思是说使用之前必须使用Drawable.setBounds设置Drawable的长宽。 
而setCompoundDrawablesWithIntrinsicBounds是画的drawable的宽高是按drawable固定的宽高,即通过getIntrinsicWidth()与getIntrinsicHeight()获得,所以才有The Drawables’ bounds will be set to their intrinsic bounds.这句话之说!

例如:

editTest.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.test), null, null, null);

给EditText添加触摸监听事件,当点击到drawableRight部位的时候,就重新设置图片资源

editText.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                final int DRAWABLE_LEFT = 0;
                final int DRAWABLE_TOP = 1;
                final int DRAWABLE_RIGHT = 2;
                final int DRAWABLE_BOTTOM = 3;
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    if (event.getX() >= (editText.getWidth() - editText
                            .getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
                        // your action here
                        editText.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.drawable.pull_up1), null);
                        return true;
                    }
                }
                return false;
            }
        });

ListPopupWindow

最后一步就是显示列表了

private void showListPopulWindow(){
        String[] list = { "item1", "item2", "item3", "item4" };
        listPopupWindow = new ListPopupWindow(this);
        listPopupWindow.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, list));
        listPopupWindow.setAnchorView(editText);
        listPopupWindow.setModal(true);
        listPopupWindow.show();
    }

可以给listPopupWindow 设置监听事件,当item被选择的时候干啥,当listPopupWindow消失的时候干啥
listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                editText.setText(list[i]);
            }
        });
listPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                editText.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.drawable.pull_down1), null);
            }
        });
时间: 2024-12-25 06:09:45

Android EditText+ListPopupWindow实现可编辑的下拉列表的相关文章

自定义的Android EditText

这是一个指定EditText,在我们的实际开发中,可以直接拿来用就行了,先上图看效果:        简单介绍下:当文本框有字符串时,在右边会显示一个清除的图标.点击清除的图标可以清除文本框的内容. 先上自定义编辑框代码:代码比较简单,值得注意的是onTouchEvent方法.这个是一个触摸事件,主要捕获清除图标,模拟点击事件. 1 package cn.datian.customedit; 2 3 import android.content.Context; 4 import android

Android EditText属性说明

1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 (2)在代码里设置: 通过设置EditText的setTransformationMethod()方法来实现隐藏密码或这显示密码. editText.setTransformationMethod(PasswordTransformationMethod.getInstance());//设置密码为不可见. 2

android EditText控件如何禁止输入内容

问题? android EditText控件如何禁止往里面输入内容? 修改版解决方法: EditText editText =  (EditText) findViewById(R.id.editText1); editText.setKeyListener(null); 看到这个问题大家可能有点奇怪了,EditText的功能不就是往上面写入内容吗? 再者,如果真要禁止输入文本,在布局文件中添加 android:focusable="false", 或者在代码中使用editText.s

android EditText 软键盘 一些总结

看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的时候默认弹出输入法,可以这样设置这个属相:android:windowSoftInputMode=stateVisible,这样就会默认弹起输入法,当然还有别的办法. <activity android:name=".ui.login" android:configChanges="orientation|keyboardHidden|locale" an

Android EditText多行显示及所有属性

android:id="@+id/editSms" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/saveSms" android:inputType="textMultiLine" android:gravity="left|top" andro

Android EditText属性

1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 (2)在代码里设置: 通过设置EditText的setTransformationMethod()方法来实现隐藏密码或这显示密码. editText.setTransformationMethod(PasswordTransformationMethod.getInstance());//设置密码为不可见. 2

Android EditText的属性

8.EditText的属性很多 这里介绍几个: android:hint="请输入数字!"//设置显示在空间上的提示信息 android:numeric="integer"//设置只能输入整数,如果是小数则是:decimal android:singleLine="true"//设置单行输入,一旦设置为true,则文字不会自动换行. android:password="true"//设置只能输入密码 android:textC

自定义绘制android EditText的背景,定义EditText文字的显示样式

EditText可以通过layer-list来绘制背景: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle" //框为矩形 > &l

android editText 软键盘enter键图标的设置

<EditText android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入单位" android:layout_marginLeft="10dp" android:layout_marginRight="1