コンテンツにスキップ

イベントを発火せずにEditTextへテキストを設定する

Android開発において、EditTextの値の変更を監視するとき、TextWatcherを設定すると思います。 ところが設定したTextWatcherにイベントを発火せずにsetText()しなければいけない機会があったのでその方法です。

環境

  • compileSdkVersion 30

方法

setText()するときだけ一時的にTextWatcherを削除してあげればイベントは発火しません。設定されているTextWatcherを取得する方法が無いのでちょっとめんどくさいですね。

class ExtendedEditText: AppCompatEditText {

    private var watcher: TextWatcher? = null

    constructor(context: Context): super(context)
    constructor(context: Context, attrs: AttributeSet?): super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr)

    override fun addTextChangedListener(watcher: TextWatcher?) {
        super.addTextChangedListener(watcher)

        this.watcher = watcher
    }

    /**
     * イベントを発行せずにテキストを設定する
     */
    fun setTextWithoutWatch(s: CharSequence){
        removeTextChangedListener(watcher)
        this.setText(s)
        addTextChangedListener(watcher)
    }
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    findViewById<ExtendedEditText>(R.id.some_edit).apply{
        addTextChangedListener(object: TextWatcher{
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
                //  do something
            }
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                //  do something
            }
            override fun afterTextChanged(s: Editable?) {
                //  do something
            }
        })
    }
}


最終更新日: August 9, 2021