我想要什么 我有一个 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/