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的相关问题,后期遇到了其他的再持续更新,如果没有解决问题,留言之后,共同探讨!