检测 EditTexts 的 none 是否有焦点

Detect if none of the EditTexts has focus

我的 activity 中有一些 EditText。问题很简单:如果其中 none 个有焦点,我将显示一个按钮。如果其中任何一个有焦点,我将隐藏按钮。

这是我所做的:

    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);
        }
    }

问题: 当我将焦点从一个 EditText 更改为另一个时,按钮会在焦点更改之间暂时可见。我想消除它。关于如何实现它的任何建议?

进一步详细说明用户在填写用户名字段后单击密码字段时的问题:

按钮不可见

  1. 用户名字段有焦点
  2. onFocusChange() 的用户名字段被调用
  3. 用户名字段失去焦点

按钮可见

  1. onFocusChange() 密码字段被调用
  2. 密码字段获得焦点。

按钮不可见

很明显,在第 3 点和第 4 点之间,用户名字段和密码字段都没有焦点。在那一小段时间里,按钮变得可见,这是我试图摆脱的。

试试这个:

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);
    }
}