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是不可行的,因为它需要每次点击两次才能开火.
我做了一些研究,除此之外我找到了这个帖子.它详细说明了你所拥有的类似问题(按钮无法获得焦点).尝试以下操作:在按钮上,设置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)
但他们应该只是修复按钮的焦点内容,当前的行为确实会引起一些问题(比如你的).