Android 数据绑定:InputMethodManager:startInputInner-mService.StartInputWindowGainedFocus

Android 数据绑定:InputMethodManager:startInputInner-mService.StartInputWindowGainedFocus,android,android-edittext,android-databinding,Android,Android Edittext,Android Databinding,出于安全需要,我正在使用字符数组版本的setText,以避免使用String版本 public final void setText (char[] text, int start, int len) 绑定适配器: 模拟器行为: 但问题是,当我在EditText中输入ABCD时,我显示了DCBA,并且焦点始终停留在EditText的开头 真实设备行为: 仅显示第一个字符 日志: 2020-02-04 17:37:43.760

出于安全需要,我正在使用字符数组版本的
setText
,以避免使用
String
版本

public final void setText (char[] text, 
                int start, 
                int len)
绑定适配器:

模拟器行为:

但问题是,当我在
EditText
中输入ABCD时,我显示了DCBA,并且焦点始终停留在
EditText
的开头

真实设备行为:

仅显示第一个字符

日志:

2020-02-04 17:37:43.760 4110-4110/com.bla V/InputMethodManager: 开始输入:tba=com.bla ic=com.android.internal.widget。EditableInputConnection@3e6e221 mNaviBarColor-16750956错误获取NavibarColorSuccess true,导航可见: 对,NavTrans:false 2020-02-04 17:37:43.760 4110-4110/com.bla D/InputMethodManager:startInputInner-Id:0 2020-02-04 17:37:43.767 4110-4110/com.bla I/InputMethodManager:startInputInner- mService.startInputWindowGainedFocus


IMO
CharArray
的数据绑定很糟糕,因为当我将
CharArray
更改为
String
时没有问题,这意味着
equals
方法被生成的代码破坏了

    @BindingAdapter("android:text")
    public static void setCharArray(EditText view, char[] value) {
        if(value == null) return;

        int length = view.length();
        char[] password = new char[length];
        view.getText().getChars(0, length, password, 0);

        if (Arrays.equals(value, password)) {
            Log.v("BindingAdapter out" + view.getId(), String.valueOf(value));
            view.setText(value, 0, value.length);
        }
    }
编辑1:更好的解决方案

使用实现
CharSequence
的适配器,因此的适配器版本是基于
CharSequence
的,因此我的身边不需要
BindingAdapter

class SecureString(value: CharArray?) : CharSequence {
    @Transient
    private val value: CharArray

    init {
        requireNotNull(value) { "Value must not be null" }
        this.value = value
    }

    override val length: Int
        get() = value.size

    override fun get(index: Int): Char = value[index]

    override fun subSequence(start: Int, end: Int): CharSequence {
        throw UnsupportedOperationException()
    }

    fun clear() {
        Arrays.fill(value, '\u0000')
    }

    fun toCharArray(): CharArray {
        return value
    }

}
调整
InverseBindingAdapter
以返回
SecureString

    @InverseBindingAdapter(attribute = "android:text")
    public static SecureString getSecureString(EditText view) {
        int length = view.length();
        SecureString password = new SecureString(new char[length]);

        view.getText().getChars(0, length, password.toCharArray(), 0);

        return password;
    }
    @InverseBindingAdapter(attribute = "android:text")
    public static SecureString getSecureString(EditText view) {
        int length = view.length();
        SecureString password = new SecureString(new char[length]);

        view.getText().getChars(0, length, password.toCharArray(), 0);

        return password;
    }