多次调用onFocusChange会导致“ hasFocus”变量无法使用

时间:2019-05-06 11:42:25

标签: java android android-layout android-edittext listener

我有两个EditText小部件,并且希望在用户单击以外的部件时隐藏键盘(如果当时那个键盘仍然处于活动状态)。 为此,我在两个对象上都使用了setOnFocusChangeListener

eTNom=convertView.findViewById(R.id.EditText_nom);

eTNom.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) 
            hideKeyboard(v);
    }
});

另一个setOnFocusChangeListener的处理方式完全相同。

但是,这不起作用,因为每次我单击两个EditText之一时,都会多次调用onFocusChange方法(4-5)。这样会导致hasFocus变量在调用方法后迅速在true和false之间切换,而键盘只显示很短的时间。

这正是正在发生的事情:https://imgur.com/ZFjXPPz

我看到这个问题曾经问过一次,但是接受的答案建议在清单文件中添加android:windowSoftInputMode="adjustPan"。我这样做了,但是并不能解决我的问题。我还看到有人建议在父版式中将 clickable focusable focusableInTouchMode 属性设置为true, ,但仍然无法正常工作。

我认为问题出在我有两个EditText小部件,但是当我从活动中删除一个小部件时,我仍然遇到相同的问题,因此我现在几乎迷失了,任何帮助都会非常感谢。

谢谢。

2 个答案:

答案 0 :(得分:2)

将其放在Menifest中的行下方

<activity android:name=".ActivityName"
      android:windowSoftInputMode="stateHidden"  />

或者您可以使用以下两个功能来显示/隐藏键盘

public void hideSoftKeyboard() {
    if(getCurrentFocus()!=null) {
       InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
       inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}

 /* Shows the soft keyboard */
public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.showSoftInput(view, 0);

}

答案 1 :(得分:0)

以这种方式应用:

etTextInput.setOnFocusChangeListener((v, hasFocus) -> {
                if (hasFocus) {
                    etTextInput.removeTextChangedListener(textWatcher);
                    etTextInput.addTextChangedListener(textWatcher);
                } else {
                    etTextInput.removeTextChangedListener(textWatcher);
                }
            });