2017-03-16 97 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上,當您獲得焦點時隱藏鍵盤。