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;
}