Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 检测编辑文本是否没有焦点_Android_Android Edittext_Focus - Fatal编程技术网

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()
  • 密码字段获得焦点
  • 按钮不可见

    显然,在第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);
        }
    }
    

    对不起,但这不能解决问题。让我们讨论一下这个块:
    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毫秒延迟的日志:感谢您的回复。一个简单的问题:我应该把它放在哪里?