Android 检测编辑文本是否没有焦点
我的活动中有一些编辑文本。问题很简单:如果它们都没有焦点,我将显示一个按钮。如果其中任何一个有焦点,我将隐藏按钮 以下是我所做的:Android 检测编辑文本是否没有焦点,android,android-edittext,focus,Android,Android Edittext,Focus,我的活动中有一些编辑文本。问题很简单:如果它们都没有焦点,我将显示一个按钮。如果其中任何一个有焦点,我将隐藏按钮 以下是我所做的: usernameEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { usernameFoc
usernameEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
usernameFocus = hasFocus;
adjustVisibility();
}
});
passwordEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
passwordFocus = hasFocus;
adjustVisibility();
}
});
private void adjustVisibility() {
if(usernameFocus || passwordFocus) {
button.setVisibility(View.GONE);
} else {
button.setVisibility(View.VISIBLE);
}
}
问题:
当我将焦点从一个编辑文本更改为另一个编辑文本时,按钮在焦点更改之间会立即可见。我想消除这一点。对如何实现这一目标有何建议
当用户填写用户名字段后单击密码字段时,问题的进一步阐述:
按钮不可见
onFocusChange()
onFocusChange()
if(parentView.getCurrentFocus() instanceof EditText)
{
//Hide Buttom
}else{
// Show Button
}
在调用焦点更改侦听器中的调整可见性之前,只需检查其他编辑文本是否没有如下所示的焦点
usernameEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
usernameFocus = hasFocus;
if(!passwordEditText.hasFocus())
adjustVisibility();
}
});
passwordEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
passwordFocus = hasFocus;
if(!usernameEditText.hasFocus())
adjustVisibility();
}
});
看看这是否解决了您的问题。如果您不想在从一个编辑文本切换到另一个编辑文本之间显示,请设置一些延迟
private void adjustVisibility() {
if (usernameFocus || passwordFocus) {
mButtonVisible.setVisibility(View.GONE);
} else {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Do something after 5s = 5000ms
if (usernameFocus || passwordFocus) {
mButtonVisible.setVisibility(View.GONE);
} else {
mButtonVisible.setVisibility(View.VISIBLE);
}
}
}, 5000);
}
}
对不起,但这不能解决问题。让我们讨论一下这个块:
if(!passwordEditText.hasFocus())adjustVisibility()。显然,!当我在两个EditText之间切换时,passwordEditText.hasFocus()
将始终返回true。我已经把问题说得更清楚了,请结帐。问题仍然存在,因为在焦点更改之间,这个adjustVisibility()
方法会被调用两次。延迟它只会使按钮瞬间闪烁变为长时间闪烁。按钮现在显示约5秒钟:|@Akeshwar这对我有效。当您将焦点从一个edittext更改为另一个edittext时,布尔变量的最后一个值为true,所以您的按钮被隐藏。现在,如果您的焦点丢失,而不是两个都为false,那么当我从一个EditText切换到另一个EditText时,按钮会显示给最终用户,方法adjustVisibility()
会连续调用两次,对吗?在第一个调用中,两个值都为false。因此,按钮显示。但是第二个调用很快就会出现,其中一个值是真的。因此,按钮消失。因此,在这段过渡期间,按钮确实出现过一次。这就是我的问题所在。@Akeshwar对,它调用了两次,但当第一次调用时,所有布尔值都为false,它不会分心地显示按钮,它会等待5秒钟,如果您没有集中注意力在其他edittext按钮上,按钮将显示,否则布尔值的当前值会更改,所以它不会显示按钮,如果5秒少于5秒,请增加延迟时间,应该是这样,但事实并非如此。这是我用emulator录制的屏幕视频和使用5000毫秒延迟的日志:感谢您的回复。一个简单的问题:我应该把它放在哪里?