Android 当虚拟键盘消失时,对编辑文本失去焦点

Android 当虚拟键盘消失时,对编辑文本失去焦点,android,Android,我对一些文本字段有点问题。当我关闭虚拟键盘时,我想失去对它们的关注 searchByName.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { v.getLayoutParams

我对一些文本字段有点问题。当我关闭虚拟键盘时,我想失去对它们的关注

searchByName.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {

            if (hasFocus) {
                v.getLayoutParams().width = 900;
                searchByZipcode.setVisibility(View.INVISIBLE);
                searchByDistance.setVisibility(View.INVISIBLE);
            } else {
                v.getLayoutParams().width=405;
                searchByZipcode.setVisibility(View.VISIBLE);
                searchByDistance.setVisibility(View.VISIBLE);

            }
        }
    });


    searchByZipcode.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            searchByZipcode.getLayoutParams().width=660;
            searchByName.setVisibility(View.INVISIBLE);
        }
    });

    searchByZipcode.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
    /* When focus is lost check that the text field
    * has valid values.
    */
            if (hasFocus) {
                v.getLayoutParams().width=663;
                searchByName.setVisibility(View.INVISIBLE);
            } else {
                v.getLayoutParams().width=240;
                searchByName.setVisibility(View.VISIBLE);
            }
        }
    });


    searchByName.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int keyCode, KeyEvent event) {
            if (event.getAction() != KeyEvent.ACTION_DOWN) {
                return false;
            }
            if(keyCode == KeyEvent.KEYCODE_ENTER)
            {
                searchByName.clearFocus();
                return true;
            }
            else
            {
                return false;
            }
        }
    });

    searchByZipcode.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int keyCode, KeyEvent event) {
            if (event.getAction() != KeyEvent.ACTION_DOWN) {
                return false;
            }
            if(keyCode == KeyEvent.KEYCODE_ENTER)
            {
                searchByZipcode.clearFocus();
                return true;
            }
            else
            {
                return false;
            }
        }
    });

    searchByDistance.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int keyCode, KeyEvent event) {
            if (event.getAction() != KeyEvent.ACTION_DOWN) {
                return false;
            }
            if(keyCode == KeyEvent.KEYCODE_ENTER)
            {
                searchByDistance.clearFocus();
                return true;
            }
            else
            {
                return false;
            }
        }
    });
比方说,我选择一个字段,在其中写入一些内容,然后按back键关闭键盘。在这种情况下,我希望自动失去对所选文本字段的关注

这是我到目前为止试过的。问题是,如果我在
searchByName
中按done(回车),它会立即切换到第二个文本字段(
searchByZipcode
),但不会应用
focuschange监听器。它仅在我关闭键盘后适用

searchByName.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {

            if (hasFocus) {
                v.getLayoutParams().width = 900;
                searchByZipcode.setVisibility(View.INVISIBLE);
                searchByDistance.setVisibility(View.INVISIBLE);
            } else {
                v.getLayoutParams().width=405;
                searchByZipcode.setVisibility(View.VISIBLE);
                searchByDistance.setVisibility(View.VISIBLE);

            }
        }
    });


    searchByZipcode.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            searchByZipcode.getLayoutParams().width=660;
            searchByName.setVisibility(View.INVISIBLE);
        }
    });

    searchByZipcode.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
    /* When focus is lost check that the text field
    * has valid values.
    */
            if (hasFocus) {
                v.getLayoutParams().width=663;
                searchByName.setVisibility(View.INVISIBLE);
            } else {
                v.getLayoutParams().width=240;
                searchByName.setVisibility(View.VISIBLE);
            }
        }
    });


    searchByName.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int keyCode, KeyEvent event) {
            if (event.getAction() != KeyEvent.ACTION_DOWN) {
                return false;
            }
            if(keyCode == KeyEvent.KEYCODE_ENTER)
            {
                searchByName.clearFocus();
                return true;
            }
            else
            {
                return false;
            }
        }
    });

    searchByZipcode.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int keyCode, KeyEvent event) {
            if (event.getAction() != KeyEvent.ACTION_DOWN) {
                return false;
            }
            if(keyCode == KeyEvent.KEYCODE_ENTER)
            {
                searchByZipcode.clearFocus();
                return true;
            }
            else
            {
                return false;
            }
        }
    });

    searchByDistance.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int keyCode, KeyEvent event) {
            if (event.getAction() != KeyEvent.ACTION_DOWN) {
                return false;
            }
            if(keyCode == KeyEvent.KEYCODE_ENTER)
            {
                searchByDistance.clearFocus();
                return true;
            }
            else
            {
                return false;
            }
        }
    });

要执行此操作,您可以通过以下操作清除当前焦点:

@Override
public void onBackPressed() {
    super.onBackPressed();

    View view = getCurrentFocus();
    if (view != null) {
        view.clearFocus();
    }
}

我应该把这个放在哪里?我忘了提到我的文本字段是一个片段。我想我必须在
MainActivity
中使用这个覆盖函数,对吗?是的,这应该在您的活动中。