Android中EditText相关问题总结

前言

android开发中常会使用到EditText控件,这里记录一下平常遇到的一些小问题。这里用了两个模拟器(8.1.0和5.0.2系统)来做测试机型:在这里插入图片描述

问题描述点

1.进入页面EditText自动弹出键盘问题

  • 问题处:在旧系统上的EditText默认是不弹出键盘的(大概是在7.0之前),首次进入页面如下(左边为8.1.0,默认弹出软键盘):在这里插入图片描述
  • 解决方案:EditText的父布局添加下面两个属性(意思为默认让父布局强制获取焦点)
    android:focusableInTouchMode="true"
    android:focusable="true"

2.EditText编辑框文字从右往左排版

  • 问题处:EditText布局添加属性,排版在末尾|垂直居中
        android:gravity="end|center_vertical"

在一定条件下可以实现文字从右往左的排列,不过前提是EditText没有hint提示语和初始化设置值。这里两种情况不一样,若只有hint提示语,在8.1.0系统的手机上获取焦点,编辑什么的显示是正常的,但是在5.0上就不行了,截图如下:在这里插入图片描述
第二种初始化设置文字内容,两种机型的手机都会出现光标首先出现在文字的最左侧,然后再出现在手指点击的位置(这里就不截图了)。

  • 解决方案:复制下面代码就好,EditText较多的时候建议稍稍封装一下
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            et.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
            et.setTextDirection(View.TEXT_DIRECTION_RTL);
        }
        et.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                    if (TextUtils.isEmpty(s.toString())) {
                        et.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
                        et.setTextDirection(View.TEXT_DIRECTION_RTL);
                    } else {
                        et.setGravity(Gravity.END | Gravity.CENTER_VERTICAL);
                        et.setTextDirection(View.TEXT_DIRECTION_LTR);
                    }
                }
            }
        });
 	
 	private void etTextChangedListener(final EditText view) {
        view.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                    if (TextUtils.isEmpty(s.toString())) {
                        view.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
                        view.setTextDirection(View.TEXT_DIRECTION_RTL);
                    } else {
                        view.setGravity(Gravity.END | Gravity.CENTER_VERTICAL);
                        view.setTextDirection(View.TEXT_DIRECTION_LTR);
                    }
                }
            }
        });
    }

3.EditText弹窗导致布局错乱问题

  • 问题处:首先EditText是在屏幕比较底部的位置(EditText距底部的位置高度小于键盘的高度),下图是键盘弹出前的布局
    在这里插入图片描述下图是键盘弹出后的布局在这里插入图片描述
    显然因为键盘的关系顶部的布局被上移了。
  • 解决方案:场景一,正常情况下,在AndroidManifest.xml中的activity节点加上下面这句话
 android:windowSoftInputMode="stateVisible|adjustResize"

在这里插入图片描述
场景二,
在布局使用到ScrollView的时候,在setContentView()之后

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

在布局ScrollView中添加属性

android:fillViewport="true"

如果仍不能满足需求的话这里提供其他的解决方案
关于Editext获得焦点后,View上移问题。
EditText弹出软键盘后布局上移问题

4.第一次点击无法获取焦点

  • 问题处:RecyclerView的Item中含有EditText,点击item置为选中状态,并且获取焦点,如下图展示:
    在这里插入图片描述
  • 解决方案:每次点击选中的时候置为选中状态,将上一个item置为取消选中就不说了。这里如果选中的item是带有编辑框的时,判断一下,刷新执行当前条目的时候加上
	holder.mEtPrice.setFocusable(true);
    holder.mEtPrice.setFocusableInTouchMode(true);
    holder.mEtPrice.requestFocus();
    mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

5.RecyclerView中删除item

  • 问题处:item中含有多个EditText时,删除item刷新布局edittext内得到的position位置错乱
  • 解决方案:用tag做标签,如下:
 if (holder.mEtPassengerName.getTag() != null && holder.mEtPassengerName.getTag() instanceof TextWatcher) {
                holder.mEtPassengerName.removeTextChangedListener((TextWatcher) holder.mEtPassengerName.getTag());
            }
            MyTextWatcher textWatcher1 = new MyTextWatcher(){
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    mPassengerBeanList.get(position).setName(s.toString().trim());
                }
            };
            holder.mEtPassengerName.addTextChangedListener(textWatcher1);
            holder.mEtPassengerName.setTag(textWatcher1);

最后

这里是平常所用到的EditText的相关问题,后期遇到了其他的再持续更新,如果没有解决问题,留言之后,共同探讨!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值