美文网首页Android
Android EditText输入框

Android EditText输入框

作者: xiesen | 来源:发表于2019-07-16 15:07 被阅读0次

    EditText输入框

    <EditText
        android:id="@+id/pwdText"
        android:layout_width="291dp"
        android:layout_height="52dp"
        android:layout_weight="1"
        android:ems="10"
        android:selectAllOnFocus="true"
        android:inputType="textPassword"
        android:hint="请输入登录密码"
        android:textColorHint="#FF999999"
        android:gravity="center_vertical"
        android:textSize="17sp"
    />
    

    1.默认提示文本

    默认提示文本的两个属性如下:

    android:hint="默认提示文本"
    android:textColorHint="#95A1AA"
    

    2.获得焦点后全选组件内所有文本内容

    当我们想在点击输入框获得焦点后,不是将光标移动到文本的开始或者结尾;而是 获取到输入框中所有的文本内容的话!这个时候我们可以使用selectAllOnFocus属性

    android:selectAllOnFocus="true"
    

    3.限制EditText输入类型

    ​ 有时我们可能需要对输入的数据进行限制,比如输入电话号码的时候,你输入了一串字母,这 显然是不符合我们预期的,而限制输入类型可以通过inputType属性来实现!

    比如限制只能为电话号码(phone),密码(textPassword):

    可选参数如下:

    a.文本类型,多为大写、小写和数字符号

    android:inputType="none"  
    android:inputType="text"  
    android:inputType="textCapCharacters"  
    android:inputType="textCapWords"  
    android:inputType="textCapSentences"  
    android:inputType="textAutoCorrect"  
    android:inputType="textAutoComplete"  
    android:inputType="textMultiLine"  
    android:inputType="textImeMultiLine"  
    android:inputType="textNoSuggestions"  
    android:inputType="textUri"  
    android:inputType="textEmailAddress"  
    android:inputType="textEmailSubject"  
    android:inputType="textShortMessage"  
    android:inputType="textLongMessage"  
    android:inputType="textPersonName"  
    android:inputType="textPostalAddress"  
    android:inputType="textPassword"  
    android:inputType="textVisiblePassword"  
    android:inputType="textWebEditText"  
    android:inputType="textFilter"  
    android:inputType="textPhonetic" 
    

    b.数值类型

    android:inputType="number"  
    android:inputType="numberSigned"  
    android:inputType="numberDecimal"  
    android:inputType="phone"//拨号键盘  
    android:inputType="datetime"  
    android:inputType="date"//日期键盘  
    android:inputType="time"//时间键盘
    

    4.设置最小行,最多行,单行,多行,自动换行

    EditText默认是多行显示的,并且能够自动换行,即当一行显示不完的时候,他会自动换到第二行

    a.设置最小行的行数:

    android:minLines="3"
    

    b.设置EditText最大的行数:

    android:maxLines="3"
    

    c.限制EditText只允许单行输入

    很多时候我们可能要限制EditText只允许单行输入,而且不会滚动,比如上面的登陆界面的 例子,我们只需要设置

    android:singleLine="true"
    

    即可实现单行输入不换行

    5.设置文字间隔,设置英文字母大写类型

    a.设置字的间距

    android:textScaleX="1.5"    //设置字与字的水平间隔
    android:textScaleY="1.5"    //设置字与字的垂直间隔
    

    c.设置英文字母大写类型

    EditText还为我们提供了设置英文字母大写类型的属性:android:capitalize 默认none,提供了三个可选值:

    sentences:仅第一个字母大写
    words:每一个单词首字母大小,用空格区分单词
    characters:每一个英文字母都大写
    

    6.控制EditText四周的间隔距离与内部文字与边框间的距离

    我们使用margin相关属性增加组件相对其他控件的距离,比如android:marginTop = "5dp" 使用padding增加组件内文字和组件边框的距离,比如android:paddingTop = "5dp

    7.设置EditText获得焦点,同时弹出小键盘

    首先是让EditText获得焦点与清除焦点的

    edit.requestFocus(); //请求获取焦点
    edit.clearFocus(); //清除焦点
    

    获得焦点后,弹出小键盘,笔者大部分时间就花在这个上:

    • 低版本的系统直接requestFocus就会自动弹出小键盘了
    • 稍微高一点的版本则需要我们手动地去弹键盘

    第一种:

    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
    

    第二种:

    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);     imm.showSoftInput(view,InputMethodManager.SHOW_FORCED);  
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //强制隐藏键盘  
    

    8.EditText光标位置的控制

    有时可能需要我们控制EditText中的光标移动到指定位置或者选中某些文本!
    EditText为我们提供了setSelection()的方法,方法有两种形式:
    
    一个参数的是设置光标位置的,两个参数的是设置起始位置与结束位置的中间括的部分,即部分选中!
    当然我们也可以调用setSelectAllOnFocus(true);让EditText获得焦点时选中全部文本!
    另外我们还可以调用setCursorVisible(false);设置光标不显示
    还可以调用getSelectionStart()和getSelectionEnd获得当前光标的前后位置
    

    9.带表情的EditText的简单实现

    1.使用SpannableString来实现
    2.使用Html类来实现
    这里笔者用的是第一种,这里只实现一个简单的效果,大家可以把方法抽取出来,自定义一个EditText;

    代码如下:

    public class MainActivity extends Activity {
        private Button btn_add;
        private EditText edit_one;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn_add = (Button) findViewById(R.id.btn_add);
            edit_one = (EditText) findViewById(R.id.edit_one);
            btn_add.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    SpannableString spanStr = new SpannableString("imge");
                    Drawable drawable = MainActivity.this.getResources().getDrawable(R.drawable.f045);
                    drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
                    ImageSpan span = new ImageSpan(drawable,ImageSpan.ALIGN_BASELINE);
                    spanStr.setSpan(span,0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    int cursor = edit_one.getSelectionStart();
                    edit_one.getText().insert(cursor, spanStr);
                }
            });
        }
    }
    

    10.带删除按钮的EditText

    ​ 当我们输入内容后,右面会出现这样一个小叉叉的图标,我们点击后会清空输入框中的内容!
    实现起来其实也很简单:

    为EditText设置addTextChangedListener,然后重写TextWatcher()里的抽象方法,这个用于监听输入框变化的;然后setCompoundDrawablesWithIntrinsicBounds设置小叉叉的图片;最后,重写onTouchEvent方法,如果点击区域是小叉叉图片的位置,清空文本!

    实现代码如下:

    public class EditTextWithDel extends EditText {
    
        private final static String TAG = "EditTextWithDel";
        private Drawable imgInable;
        private Drawable imgAble;
        private Context mContext;
    
        public EditTextWithDel(Context context) {
            super(context);
            mContext = context;
            init();
        }
    
        public EditTextWithDel(Context context, AttributeSet attrs) {
            super(context, attrs);
            mContext = context;
            init();
        }
    
        public EditTextWithDel(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            mContext = context;
            init();
        }
    
        private void init() {
            imgInable = mContext.getResources().getDrawable(R.drawable.delete_gray);
            addTextChangedListener(new TextWatcher() {
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
    
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                    setDrawable();
                }
            });
            setDrawable();
        }
    
        // 设置删除图片
        private void setDrawable() {
            if (length() < 1)
                setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
            else
                setCompoundDrawablesWithIntrinsicBounds(null, null, imgInable, null);
        }
    
        // 处理删除事件
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (imgInable != null && event.getAction() == MotionEvent.ACTION_UP) {
                int eventX = (int) event.getRawX();
                int eventY = (int) event.getRawY();
                Log.e(TAG, "eventX = " + eventX + "; eventY = " + eventY);
                Rect rect = new Rect();
                getGlobalVisibleRect(rect);
                rect.left = rect.right - 100;
                if (rect.contains(eventX, eventY))
                    setText("");
            }
            return super.onTouchEvent(event);
        }
        @Override
        protected void finalize() throws Throwable {
            super.finalize();
        }
    }
    
    

    相关文章

      网友评论

        本文标题:Android EditText输入框

        本文链接:https://www.haomeiwen.com/subject/euhtlctx.html