需求: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();
}
}
}