首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库: InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus

数据库: InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
EN

Stack Overflow用户
提问于 2020-02-03 13:19:41
回答 1查看 1.2K关注 0票数 0

出于安全需要,我使用setText的char数组版本来避免使用String版本。

代码语言:javascript
复制
public final void setText (char[] text, 
                int start, 
                int len)

BindingAdapter :

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-04 16:41:47

IMO CharArray对绑定很感兴趣,因为当我将CharArray更改为String时没有任何问题,这意味着equals方法被通用代码破坏了。

代码语言:javascript
复制
    @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

代码语言:javascript
复制
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

代码语言:javascript
复制
    @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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60040077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档