이번 시간에는 키보드를 보이거나 숨겨야할때 사용하는 코드를 알아보도록하겠습니다.
계획은 글을 작성할 수 있는 에딕텍스트와 키보드를 올리고 내릴 버튼을 통해서 키보드를 올리고 내려보도록 하겠습니다.
아 그리고 액티비티가 켜질때 키보드도 같이 올라오도록 만들어보겠습니다.
해당 코드는 api 21 , api 30 에서 테스트 되었습니다.
일단 코드 먼저 복사,붙여넣기 해주세요.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
android:focusable="true"
tools:context=".MainActivity">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="키보드 on/off"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/editText" />
</androidx.constraintlayout.widget.ConstraintLayout>
붙여넣기 하실 때 주의할 부분이 있는데 EditText 의 부모인 ConstraintLayout 에 속성으로 android:focusableInTouchMode="true" 와 android:focusable="true" 를 추가해주셔야 합니다.
이유는 액티비티 코드에서 설명하도록 하겠습니다.
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import android.os.Bundle;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText editText = findViewById(R.id.editText);
Button button = findViewById(R.id.button);
editText.requestFocus();
keyBordShow(); // 해당 메소드로 키보드가 올라오지 않으면 manifests 에 액티비티 속성으로 android:windowSoftInputMode="stateVisible" 를 추가해주도록 한다.
button.setOnClickListener(view -> {
if (editText.isFocused()) {
editText.clearFocus(); // 메소드가 동작했으나 포커스가 사라지지 않는다면 레이아웃 파일로 가서 레이아웃에 포커스 관련 속성이 추가되어 있는지 확인한다.
keyBordHide();
} else {
editText.requestFocus();
keyBordShow();
}
});
}
void keyBordHide() {
Window window = getWindow();
new WindowInsetsControllerCompat(window, window.getDecorView()).hide(WindowInsetsCompat.Type.ime());
}
void keyBordShow() {
Window window = getWindow();
new WindowInsetsControllerCompat(window, window.getDecorView()).show(WindowInsetsCompat.Type.ime());
}
}
처음 화면이 켜질때 EditText 에 커서가 보이도록 포커스를 줬고 키보드가 보이게 만들었습니다.
여기서 키보드가 안올라 온다면 manifests 에 액티비티 속성으로 android:windowSoftInputMode="stateVisible" 을 추가해주세요.
액티비티가 실행될 때 키보드가 같이 올라오게 만들어주는 속성입니다.
버튼이 눌리면 에디텍스트에 포커스(커서)가 있는지 확인하고 있으면 포커스를 없애고, 키보드를 숨깁니다.
포커스가 없다면 반대로 동작하게 만들었습니다.
여기서 포커스를 없애는 clearFocus() 가 동작했을때 아까 activity_main.xml 에서 레이아웃에 설정한 포커스 관련 코드가 없으면, 다시 에딧텍스트로 포커스가 들어가는 문제가 생길 수 있습니다.
clearFocus() 메소드 실행 후 가장 첫번째 포커스 가능한 뷰를 찾아서 다시 포커스를 잡아주는데 그 뷰가 하필 방금 포커스를 없앤 에딧텍스트인 경우에 생기는 문제입니다.
자세한 내용은 공식 홈페이지 clearFocus() 의 Note 부분을 확인해주세요.
https://developer.android.com/reference/android/view/View#clearFocus()
마지막으로 시연 영상입니다.
'안드로이드 자바' 카테고리의 다른 글
[JAVA][Android] 리사이클러뷰 (원리) (0) | 2022.02.26 |
---|---|
[JAVA][Android] 막대 그래프 만들기 (0) | 2022.02.22 |
[JAVA][Android] URL과 DECODE 활용하기 (0) | 2022.02.18 |
[JAVA][Android] Intent로 객체 전달하기. (0) | 2022.02.16 |
[JAVA][Android] 이미지 넘겨보기 (0) | 2022.02.14 |