Android:用户完成编辑后评估EditText

Age*_*opf 4 android button textwatcher android-edittext

我想要的是 我有一个EditText,用户可以输入一个值,例如10.40.一旦用户完成编辑,我将其输入格式化为货币,例如上面提到的值将被格式化为$ 10.40(在Locale.US的情况下).我将该结果显示在用户之前编辑的相同EditText中.

问题 因为我要格式化(即修改)他的输入,我需要知道他什么时候完成(因此我的格式不会干扰他正在进行的输入).

我尝试 TextWatcher不是一个选项,因为它会在每次编辑时触发,因此当用户输入一个,零,四,点和零(= 10.40)时.我目前正在使用OnFocusChangeListener,它可以正常工作,但问题是:我的应用程序中有按钮,如果用户在编辑EditText后单击按钮,EditText将不会丢失Focus,因此我的格式化代码永远不会被调用. ..

在此之后,我尝试弄乱按钮的焦点,将其设置为FocusableInTouchMode - 这导致按钮必须被点击两次才能触发(这是一个不行),因为它第一次获得焦点并且第二次获得激活时间.经过这么多的黑客攻击后,我想知道是否有人知道如何解决这个困境.

一些代码

我将以下OnFocusChangeListener添加到我的EditText,其功能我在上面描述.EditText封装在CurrencyTextbox中(实际上并不相关):

@Override
protected OnFocusChangeListener getOnFocusChangeListener() {
    return new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                //Member variable in the class which contains an EditText
                CurrencyTextbox.this.hadFocus = true;
            } else {
                // Thes EditText has lost focus
                Log.v(TAG, "Lost focus.");
                if (CurrencyTextbox.this.hadFocus) {
                    // We previously had focus, now we lost it, format the user input!
                    // Get current value of the Textbox
                    String value = CurrencyTextbox.this.textbox.getText().toString();
                    // Formatting the user input
                    value = String.format(//Doing some formatting);
                    // Reset the had focus
                    CurrencyTextbox.this.hadFocus = false;
                }
            }
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果我的EditText失去焦点,上面的OnFocusChangelistener只会被调用,但是当我点击Activity中的按钮时它不会失去焦点,如上所述,将Button的isFocusableInTouchMode设置为true是不可行的,因为它需要每次点击两次才能开火.

Rea*_*oid 9

我做了一些研究,除此之外我找到了这个帖子.它详细说明了你所拥有的类似问题(按钮无法获得焦点).尝试以下操作:在按钮上,设置setFocusable(true)(不是setFocusableInTouchMode!因为这会产生您在OP中声明的烦人行为),然后在按钮上设置以下OnClickListener:

    return new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO workaround because of android issue nr. 2705
            button.requestFocusFromTouch();
            // Do some stuff to handle OnClick
        }
    };
Run Code Online (Sandbox Code Playgroud)

但他们应该只是修复按钮的焦点内容,当前的行为确实会引起一些问题(比如你的).