我想要 的我有一个 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 中的按钮时它不会失去焦点,并且如上所述,将 Button 的 isFocusableInTouchMode 设置为 true 是不可行的,因为它需要每次点击两次才能触发。