当EditText不可见时未触发Android addTextChangedListener

时间:2018-11-01 14:20:20

标签: android

我正在构建一个PIN输入屏幕,该屏幕具有一个不可见的EditText来收集PIN和四个在用户输入PIN时填充的ImageView。当EditText可见时,一切正常,但是当我使其不可见时,则不会触发addTextChangedListener?

XML

<EditText
    android:id="@+id/pinEntryEditText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="false"
    android:visibility="invisible"
    android:maxLength="4"
    android:inputType="numberPassword"/>

代码

mPinEntryEditText.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) {
            switch (s.length()) {
                case 1:
                    setPinFieldColor(mPinOneImageView, R.color.white);
                    break;
                case 2:
                    setPinFieldColor(mPinTwoImageView, R.color.white);
                    break;
                case 3:
                    setPinFieldColor(mPinThreeImageView, R.color.white);
                    break;
                case 4:
                    setPinFieldColor(mPinFourImageView, R.color.white);
                    break;
            }
        }
    });

2 个答案:

答案 0 :(得分:1)

这似乎是故意行为。

TextView source(EditText扩展了TextView)将覆盖onVisibilityChanged()

@Override
protected void onVisibilityChanged(View changedView, int visibility) {
    super.onVisibilityChanged(changedView, visibility);
    if (mEditor != null && visibility != VISIBLE) {
        mEditor.hideCursorAndSpanControllers();
        stopTextActionMode();
    }
}

如您所见,如果View的可见性不可见,将调用stopTextActionMode(),这基本上停止了对View的所有更新。这可能是为了节省资源,因为通常在不可见的视图中,您不需要监听状态的变化。

不幸的是,虽然我并没有真正理解为什么您需要从不可见的文本输入中接收更新,但是似乎您无法覆盖此行为。

答案 1 :(得分:1)

我假设您不想让EditText可见,因为您希望输入直接进入ImageViews。

我可以推荐像https://github.com/alphamu/PinEntryEditText这样的外部库吗?

-

如果您想提出自己的解决方案,也许您可​​以只显示键盘并使用onKeyDown收听键盘输入?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    return super.onKeyDown(keyCode, event);
    //Logic...
}