App노자
[Android] clearFocus하는 방법 (dispatchTouchEvent) 본문
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();
}
}
});
}
}
마지막으로 위에 화면을 구현하기 위해 작성한 전체 코드이다
'Android > AndroidStudio' 카테고리의 다른 글
[Android] Fragment (프래그먼트) (0) | 2023.01.17 |
---|---|
[Android] Activity LifeCycle (액티비티 생명주기) (0) | 2023.01.16 |
[Android] ActionBar(액션바) 제거하는 방법 (0) | 2022.12.31 |
[Android Studio] Soft Keyboard 내리는 방법 (0) | 2022.12.30 |
[Android] ScrollView (0) | 2022.12.27 |