App노자

[Android] clearFocus하는 방법 (dispatchTouchEvent) 본문

Android/AndroidStudio

[Android] clearFocus하는 방법 (dispatchTouchEvent)

앱의노예 2023. 1. 1. 21:56

 

 

EditText를 터치하면 OnFocus 상태가 되며 하단에서 키보드가 올라온다

일반적으로 사용하는 앱들은 키보드 이외의 다른 화면을 클릭하면 키보드가 내려간다

하지만 이것은 별도의 처리를 한 앱의 경우이고 일반적으로는 다른 화면을 눌러도 키보드는 내려가지 않는다

 

 

- Kotlin -

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { 
    return super.dispatchTouchEvent(ev)
}

- Java -

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    return super.dispatchTouchEvent(ev);
}

 

먼저 사용자가 화면을 터치하는 걸 인식할 수 있게 해줘야 한다

MotionEvent는 동작 이벤트를 보고 하는 데 사용되는 Object이며

MotionEvent를 dispatchTouchEvent(MotionEvent event)로 재정의하여 작성하면 화면의 어떤 부분을 터치하더라도 인식할 수 있다

 

if (event.getAction() == MotionEvent.ACTION_DOWN) {
    View v = getCurrentFocus();
    if ( v instanceof EditText) {
        Rect outRect = new Rect();
        v.getGlobalVisibleRect(outRect);
        if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
            v.clearFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }
    }
}

 

Focus를 강제로 clear 하는 코드이다 

ACTION_DOWN일 때 동작하도록 구현되어 있다

 

public class MainActivity extends AppCompatActivity {

    private EditText edit_text1 = null;

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if ( v instanceof EditText) {
                Rect outRect = new Rect();
                v.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
                    v.clearFocus();
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return super.dispatchTouchEvent( event );
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edit_text1 = (EditText) findViewById(R.id.edit_text1);

        edit_text1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    Toast toast = Toast.makeText(getApplicationContext(), "in", Toast.LENGTH_SHORT);
                    toast.show();

                } else {
                    Toast toast = Toast.makeText(getApplicationContext(), "out", Toast.LENGTH_SHORT);
                    toast.show();
                }
            }
        });
    }
}

 

마지막으로 위에 화면을 구현하기 위해 작성한 전체 코드이다