Android는 EditText의 초점을 잃고 시스템 소프트 키보드를 닫기 위해 공백을 클릭합니다

11708 단어 학습 노트
쓸데없는 말은 하지 말고 바로 해결 방향에 올라가라.
여기서 나의 해결 방향은 사건의 분배를 통해 손가락 밑의 위치가editText인지 아닌지를 판단하는 것이다.만약 편집Text를 눌렀다면 원래대로 진행합니다.만약 편집Text를 누르지 않았다면 편집Text는 초점을 잃고 키보드를 거두어야 합니다.그래서 모두 세 개의 점이 있다.
  • 클릭 이벤트는 어디에서 캡처하여 처리합니까?
  • 클릭 위치가 editText인지 아닌지를 어떻게 판단합니까?
  • 어떻게 소프트 키보드를 접고 편집 텍스트의 초점을 잃게 합니까?

  • 한 명씩 보기:
  • 우선Activity의dispatchTouchEvent 방법에서 클릭 이벤트를 캡처할 수 있습니다.왜냐하면 이것은 클릭 이벤트의 분배에 관한 내용이다.간단하게 말하면 우리가 화면을 클릭할 때마다 시스템은 클릭 이벤트 이벤트를 생성하고 디스패치 터치 이벤트 방법을 통해 처리한다. 이벤트에는 클릭이 있는 좌표가 포함되어 있다.구체적이고 상세한 내용에 흥미가 있는 독자는 스스로 이해할 수 있으니, 여기서는 더 이상 말하지 않겠다.
  • 이벤트를 통해 클릭할 수 있는 위치를 알려드렸는데 편집 텍스트의 위치는요?getcurrentFocus 이 방법으로 현재 초점이 있는view를 얻을 수 있고 getLocationInWindow를 통해 window에 있는 위치를 얻을 수 있습니다.판단을 하시면 됩니다.현재 초점이 있는view가editText가 아니라면 판단할 필요가 없습니다.
  • Input Method Manager의hide Soft Input From Window 방법을 통해 접을 수 있습니다.

  • 이것이 바로 대체적인 사고방식이다. 그 다음에 코드의 실현을 보면 다음과 같다.
    public class EditActivity extends AppCompatActivity {
        private TextInputEditText textInputEditText;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_edit);
            
            textInputEditText = findViewById(R.id.textInputEditText_main);
        }
    
    
        //        
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            //       ,     view,          
            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                //         view
                View v = getCurrentFocus();
                //            
                if (isShouldHideKeyboard(v, ev)) {
                    hideKeyboard(v.getWindowToken());
                }
            }
            //   activity     ,    ,              
            return super.dispatchTouchEvent(ev);
        }
    
        //         
        private boolean isShouldHideKeyboard(View v, MotionEvent event) {
            //           view editText           
            if (v instanceof EditText) {
                int[] l = {0, 0};
                v.getLocationInWindow(l);
                int left = l[0],
                        top = l[1],
                        bottom = top + v.getHeight(),
                        right = left + v.getWidth();
                //   EditText   ,   。
                return !(event.getX() > left) || !(event.getX() < right)
                        || !(event.getY() > top) || !(event.getY() < bottom);
            }
            //       EditText   ,           ,       EditText 
            return false;
        }
    
        //       editText    
        private void hideKeyboard(IBinder token) {
            textInputEditText.clearFocus();
            if (token != null) {
                //     InputMethodManager             
                //InputMethodManager           manager
                InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                if (im != null) {
                    im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
                }
            }
        }
    
    }
    
    

    코드에 상세한 주석이 있으니, 당신들에게 도움을 줄 수 있기를 바랍니다.모르는 게 있으면 댓글로 남겨주세요.

    좋은 웹페이지 즐겨찾기