EditText設置ellipsize無效;EditText設置setSelection無效

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章