我想要的 我有一个EditText,用户可以在其中输入值,例如10.40。一旦用户完成编辑,我会将他的输入格式化为货币,例如上述值将被格式化为$10.40(在Locale.US的情况下)。我将结果显示在用户之前编辑过的同一EditText中。
问题 因为我将要格式化(即修改)他的输入,所以我需要知道他什么时候完成了输入(这样我的格式化不会干扰他正在进行的输入)。
我尝试过的 TextWatcher不是一个选项,因为它在每次编辑时都会触发,因此当用户输入一个、零、四、点和零(=10.40)时会触发多次。我目前正在使用OnFocusChangeListener,它起到了期望的作用,但问题是:我在应用程序中有按钮,如果用户在编辑EditText后点击按钮,EditText不会失去焦点,因此我的格式化代码永远不会被调用……
在这之后,我尝试了一些关于按钮焦点的操作,将其设置为FocusableInTouchMode——这会导致必须两次点击按钮才能触发(这是不可行的),因为它在第一次获得焦点并在第二次激活。经过这么多的hack,我想知道是否有人有解决这个困境的想法。
一些代码
我向我的EditText添加了以下OnFocusChangeListener,其功能如上所述。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并不可行,因为这样需要每次点击两次才能触发。