我想要什么 我有一个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;
}
}
}
};
}
问题是,如果我的EditText失去焦点,上面的OnFocusChangelistener只会被调用,但是当我单击Activity中的按钮时它不会失去焦点,如上所述,设置Button的isFocusableInTouchMode是不可行的为真,因为每次点击都需要点击两次。
答案 0 :(得分:9)
我做了一些研究,其中包括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
}
};
但他们应该只是修复按钮的焦点内容,目前的行为确实会引起一些问题(比如你的)。
答案 1 :(得分:0)
尝试同时使用View.setFocusableInTouchMode()
和View.requestFocus()
。您可以使用onKeyListener()
界面检测用户输入并在每个onKey
事件后启动计时器,以便在合理延迟后开始编辑。
答案 2 :(得分:0)
你得到的问题是什么?需要在setOnFocusChangeListener
中加入editfield
。检查一下。并且必须覆盖onFocusChange。
检查那个......
答案 3 :(得分:0)
是的,编辑文本一旦出现问题就不会失去焦点。经过相当多的谷歌搜索后,我发现仅通过解决方法就可以达到预期的效果。
我有类似的要求,我做了一个解决方法来完成上述任务,它对我很有用。
解决方法如下:
为editText设置onClickListener,并在onClick事件中设置一个标记单击editText的标志。
为editText设置onKeyListener并获取onKey事件中editText的当前值。
现在,假设您已在活动/对话框中单击了完成/后退按钮。在这里,您可以检查单击editText时设置的标志。所以,如果它真的让任何程序调用你想要的。
EditText v = (EditText) layout.findViewById(R.id.framerate);
v.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Log.d(ExploreUIActivity.TAG, "Insided onClick");
vClicked= true;
}
});
v.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
Log.d(ExploreUIActivity.TAG, "Inside onKeyListener");
value = ((EditText) v).getText().toString();
return false;
}
});
现在为后退/完成按钮设置onClickListener并检查标志是否已设置
back.setOnClickListener(new OnClickListener() {
public onClick(View v) {
//check the flag
//if set do some stuff
});