如何有效地清除ScrollView中多个EditText字段的焦点?

时间:2017-03-16 00:08:32

标签: android android-edittext android-scrollview

我有以下代码:

public void hideKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

public void setupDialog(View view) {
    // Set up touch listener for non-text box views to hide keyboard.
    if (!(view instanceof EditText)) {
        view.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View view, MotionEvent event) {
                hideKeyboard(view);
                return false;
            }
        });
    }

    //If a layout container, iterate over children and seed recursion.
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            View innerView = ((ViewGroup) view).getChildAt(i);
            setupDialog(innerView);
        }
    }
}

public void setupEditTextFocusChangedListeners(View view) {
    if (view instanceof EditText) {
        view.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if (hasFocus) {
                    ((EditText) view).setSelection(((EditText) view).getText().length());
                }
            }
        });
    }

    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            View innerView = ((ViewGroup) view).getChildAt(i);
            setupEditTextFocusChangedListeners(innerView);
        }
    }
}

当键盘在任何EditText字段外部单击或滚动时隐藏,当滚动时EditText仍然保持焦点,即使键盘确实关闭。

EditText字段采用表格格式。我知道我可以在clearFocus()中单独调用每个EditText上的hideKeyboard,但这似乎并不高效。滚动时是否有更有效的方法来清除EditText的焦点?

2 个答案:

答案 0 :(得分:2)

由于只有一个EditText可以聚焦,并且你有onFocused监听器,你可以:

 private Edittext focused;
public void onFocusChange(View view, boolean hasFocus) {
            if (hasFocus) {
                ((EditText) view).setSelection(((EditText) view).getText().length());
         focused =  view
  }
}

然后在hideKeyboard()中:

public void hideKeyboard(View view) {
InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
focused.clearFocus();
}

答案 1 :(得分:1)

我认为这是一种可怕的做事方式。除了编辑文本之外,你将搞任何任何视图的触摸监听器,并且计算成本很高。我真的建议你不要这样做 - 这不是iOS,你可以按下后退键来摆脱键盘。试图让它以这种方式工作比它的价值更多的努力,并且很难做对。

忽略这一点 - 更好的方法是使您的滚视视图的根视图可以在BEFORE_DESCENDENTS的焦点上聚焦(并且可在触摸模式下聚焦),并将其聚焦于Click或onScroll。这样做意味着您不需要为层次结构中的每个视图设置onTouch,只需要设置基础。然后在你的根视图onFocus中,在获得焦点时隐藏键盘。