EditText设置ellipsize无效;EditText设置setSelection无效
程序员文章站
2024-02-04 13:53:40
...
需求:edittext,一行显示,不允许换行,最长长度100,编辑状态下光标跳至结尾,非编辑状态下结尾显示省略号。
坑1:对于edittext直接设置ellipsize不生效
坑2:光标跳至结尾不生效
坑1的解决方法:只有在setKeyListener(null)时,ellipsize才能生效,但是这样就不能响应任何点击事件了,所以需要在初始化的时候先把EditText的点击事件拿到,等到focus的时候再赋值回去。
坑2的解决方法:刚获取焦点就设置了光标在结尾,接着响应了触摸获取焦点,光标移动到了触摸位置。所以需要设置一个延时。
代码仅供参考理解,直接复制粘贴不一定好使[抠鼻]
public class MyEditText extends AppCompatEditText implements View.OnFocusChangeListener{
private Drawable mClearDrawable;
private boolean mHasFoucs = false;
private KeyListener mListener;
public ClearEditText (Context context) {
this(context, null);
}
public ClearEditText (Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.editTextStyle);
}
public ClearEditText (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public void init () {
mHasFoucs = false;
//拿到原本的KeyListener
mListener = getKeyListener();
//设置省略号在结尾
setEllipsize(TextUtils.TruncateAt.END);
}
@Override public void onFocusChange (View v, boolean hasFocus) {
this.mHasFoucs = hasFocus;
if (hasFocus) {
//等50毫秒后执行定位光标位置
postDelayed(() -> setSelection(getText().length(), getText().length()), 50);
setClearIconVisible(getText().length() > 0);
//KeyListener设置回原本的KeyListener
setKeyListener(mListener);
} else {
//KeyListener设置为空
setKeyListener(null);
setClearIconVisible(false);
UIUtil.hideKeyboardFrom(getContext(), v.getWindowToken());
mFoucsChangeHandler.update();
}
}
}
上一篇: MySQL线程池总结
下一篇: 关于for循环的一个错误