Android OnFocusChange并不总是有效的
在我的一项活动中,我有三个Android OnFocusChange并不总是有效的,android,focus,android-edittext,Android,Focus,Android Edittext,在我的一项活动中,我有三个EditTexts和一个OK按钮。OnFocusChangeListener设置为所有三个EditTexts。每次焦点丢失时,侦听器都应该触发 在EditTexts之间切换非常有效。但如果用户按下OK按钮,则不会触发EditText用户在按下按钮前聚焦的焦点更改(失去焦点) 我的代码怎么了 private class MyOnFocusChangeListener implements OnFocusChangeListener { private EditTe
EditText
s和一个OK按钮。OnFocusChangeListener
设置为所有三个EditText
s。每次焦点丢失时,侦听器都应该触发
在EditText
s之间切换非常有效。但如果用户按下OK按钮,则不会触发EditText
用户在按下按钮前聚焦的焦点更改(失去焦点)
我的代码怎么了
private class MyOnFocusChangeListener implements OnFocusChangeListener {
private EditText editText;
public MyOnFocusChangeListener(final EditText editText) {
super();
this.editText = editText;
}
@Override
public void onFocusChange(final View view, final boolean isFocused) {
if (!isFocused) {
if (editText == editText1) {
// Do a calculation
} else if (editText == editText2) {
// Do another calculation
} else if (editText == editText3) {
// Do a different calculation
}
}
}
}
@Override
public void onCreate(final Bundle bundle) {
// ...
editText1.setOnFocusChangeListener(new MyOnFocusChangeListener(editText1));
editText2.setOnFocusChangeListener(new MyOnFocusChangeListener(editText2));
editText3.setOnFocusChangeListener(new MyOnFocusChangeListener(editText3));
// ...
}
您可以尝试在用户单击“确定”或其他按钮时清除焦点 e、 g
听起来您可能在触摸模式方面有问题,从:
“触摸模式、选择和焦点之间的关系意味着您不能依赖选择和/或焦点来存在于应用程序中。”在这种情况下,您可能需要尝试使用:(..)。如果您将FocusChangeListener绑定到要观察的视图元素,则它会起作用
editText.onFocusChangeListener = this
editText.setOnClickListener(this)
通过关键字
此
意味着视图持有者
类在@dong221上展开,并结合@Harald的评论,一种清除焦点而不必跟踪最后选择的编辑文本
的方法是从窗口
对象获取对当前焦点
的引用。大概是这样的:
myDoneButton.setOnClickListener { v ->
// Assuming we are in an Activity, otherwise get a reference to the Activity first
window.currentFocus?.clearFocus()
}
谢谢你的回答。这真的很糟糕,因为我必须在两个糟糕的场景中做出选择。1.)仅当用户在点击“确定”按钮之前输入不同的编辑文本时,才会进行计算(默认情况下,按钮不可聚焦)。2.)将按钮更改为可聚焦,以便用户必须按两次按钮。后者比前者更有效,因为用户可能会在1.)中存储未计算的值。也许你应该稍微重新考虑一下应用程序的设计,它到底想做什么?当重新设计有助于解决问题时,代码可能过于复杂。代码也有一些问题,不需要创建焦点侦听器并将edittext传递给构造函数。调用onFocusChanged时,它将向您传递焦点已更改的视图,只需将view参数强制转换为编辑文本(首先检查其类型!)。链接给出:“错误404-找不到文件”。这可能会在所有三个EditText上触发OnFocusChange,因此我无法使用它。但这帮助我找到了更好的方法。现在,我将获取焦点的EditText存储在类成员中,单击按钮后,我清除特定EditText的焦点。这很有魅力。谢谢。
myDoneButton.setOnClickListener { v ->
// Assuming we are in an Activity, otherwise get a reference to the Activity first
window.currentFocus?.clearFocus()
}