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

标签 android button android-edittext textwatcher

我想要什么 我有一个 EditText,用户可以在其中输入一个值,例如 10.40。用户完成编辑后,我将他的输入格式化为一种货币,例如,上述值将格式化为 $10.40(在 Locale.US 的情况下)。我在用户之前编辑过的相同 EditText 中显示该结果。

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

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

在此之后,我尝试弄乱按钮的焦点,将其设置为 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;
                }
            }
        }
    };
}

但是问题是,上面的 OnFocusChangelistener 只有在我的 EditText 失去焦点时才会被调用,但是当我点击我的 Activity 中的按钮时它不会失去焦点,并且如上所述,设置按钮的 isFocusableInTouchMode 是不可行的为真,因为每次都需要点击两次才能触发。

最佳答案

我做了一些研究,除此之外,我发现了 this线。它详细说明了您遇到的类似问题(按钮未获得焦点)。尝试以下操作:在您的按钮上设置 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
        }
    };

但他们可能应该只修复按钮的焦点问题,当前的行为确实会导致一些问题(比如你的问题)。

关于Android:在用户完成编辑后评估EditText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8666380/

相关文章:

javascript - jQuery - append 按钮不可见

java - Android:通过Regex方法传递文本,并显示在EditText上

android - 如何防止删除Android中编辑文本的第一个字符

html - 如何处理在 HTML 表单中选择了哪个按钮?

html - 在按钮之间放置边距

android - 扩展 AppCompatEditText 时无法显示键盘

Android 4.1 SQL 服务器连接

java - Android - 使用 ant 创建更改配置值的构建配置

java - 使用套接字发送 onPreviewFrame() byte[] 的正确方法

android - Robospice/Retrofit后台服务访问数据库