出于安全需要,我使用setText的char数组版本来避免使用String版本。
public final void setText (char[] text,
int start,
int len)BindingAdapter :
public class DataBindingAdapter {
@BindingAdapter("android:text")
public static void setCharArray(ClearableEditText view, char[] value) {
if(value == null) return;
Log.v("BindingAdapter", String.valueOf(value));
view.setText(value, 0, value.length);
}
@InverseBindingAdapter(attribute = "android:text")
public static char[] getArrayFromText(ClearableEditText view) {
int length = view.getText().length();
char[] password = new char[length];
view.getText().getChars(0, length, password, 0);
Log.v("BindingAdapter", String.valueOf(password));
return password;
}
}仿真程序行为:
但问题是,当我输入ABCD时,在EditText中显示DCBA,加上焦点始终停留在EditText的开头。
真实设备行为:
只显示第一个字符。
日志:
2020年-02-04 17:37:43.760 4110-4110/com.bla V/InputMethodManager:起始输入: tba=com.bla mNaviBarColor -16750956 mIsGetNaviBarColorSuccess true,NavVisible : 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.startInputOrWindowGainedFocus
发布于 2020-02-04 16:41:47
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,因此setText的适配器版本是基于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;
}https://stackoverflow.com/questions/60040077
复制相似问题