2017-03-16 99 views
0

我有以下代码:如何有效清除ScrollView中多个EditText字段的焦点?

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字段为表格格式。我知道我可以在hideKeyboard的每个EditText上分别拨打clearFocus(),但看起来效率并不高。滚动时是否有更有效的方式来清除EditText的焦点?

回答

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

我觉得这是做事情的可怕的方式。除了编辑文本之外,你将搞乱任何视图的任何触摸监听器,并且其计算成本很高。我真的建议你不要这样做 - 这不是iOS,你需要点击后退按钮来摆脱键盘。试图以这种方式工作比努力工作更努力,并且很难得到正确的结果。

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