일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Rxjava Observable
- ar vr 차이
- 안드로이드 os 구조
- ANR이란
- 2022 플러터 안드로이드 스튜디오
- 안드로이드 라이선스
- rxjava disposable
- rxjava cold observable
- 스택 자바 코드
- 큐 자바 코드
- 안드로이드 유닛테스트란
- 객체
- 2022 플러터 설치
- 멤버변수
- rxjava hot observable
- 안드로이드 레트로핏 사용법
- 자바 다형성
- 안드로이드 레트로핏 crud
- 서비스 쓰레드 차이
- android ar 개발
- android retrofit login
- 서비스 vs 쓰레드
- 플러터 설치 2022
- jvm 작동 원리
- 안드로이드 라이선스 종류
- 스택 큐 차이
- 안드로이드 유닛 테스트
- 안드로이드 유닛 테스트 예시
- jvm이란
- 클래스
- Today
- Total
나만을 위한 블로그
[Android] 핸드폰 키보드 자판에 검색 버튼 나오게 하는 법 본문
앱을 쓰다 보면 굳이 위에 있는 검색 버튼을 누르지 않아도 되도록 설정된 키보드가 올라와서 검색하기 편했던 적이 있을 것이다.
이 글에서는 돋보기 버튼이 있는 키보드 자판이 올라오게 하는 예제의 소스코드를 설명하겠다.
먼저 이 예제를 빌드하면 아래처럼 작동한다.
보통 키보드 자판을 보면 아래로 한 칸 띄워주는 버튼이 있는데, 예제를 보면 그 위치에 돋보기 버튼이 대신 존재하는 걸 볼 수 있다.
긴 말 필요없이 xml과 자바 코드부터 보자.
<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"
tools:context=".MainActivity">
<EditText
android:id="@+id/edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:imeOptions="actionSearch"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="Autofill,TextFields" />
</androidx.constraintlayout.widget.ConstraintLayout>
특이점이라면 editText의 속성 중 inputType과 imeOptions 2개다.
imeOptions 속성은 actionSearch를 지정해야 돋보기 버튼이 생기고, inputType을 text로 해줘야 이 돋보기 버튼을 활용할 수 있다.
아래는 이론적인 내용이니 자바 코드가 궁금하다면 아래로 쭉 스크롤하자.
왜 이렇게 되냐면 원래 한 줄 띄워주는 버튼을 액션 버튼이라고 부르는데, 원래 이 버튼의 기능을 수정하려면 imeActionId 속성을 사용하고, 액션 버튼에 표시되는 라벨을 바꿔주려면 imeActionLabel 속성을 사용한다.
그런데 흔히 우리가 말하는 핸드폰의 키보드 자판인 텍스트 입력기(IME)가 화면에 올라올 때 화면 영역을 차지하는 범위를 설정하거나 액션 버튼이 미리 어떤 모양 또는 ID값을 갖게 할지를 정할 수 있다.
이 때 사용하는 것이 imeOptions 속성이다. imeOptions 속성의 종류와 각 기능에 대해선 여기서 설명하지 않는다.
그럼 왜 inputType을 text로 설정해줘야 할까? 그 이유는 imeOptions에 지정한 속성값이 액션 버튼에 반영되지 않는 경우가 있기 때문이다.
액션 버튼이 사용되는 이유 중 하나가 여러 줄에 걸쳐 텍스트들을 입력할 수 있는 멀티 라인 입력 필드에서의 줄 바꿈 기능이다. 이 멀티 라인 입력 필드에서는 기본적으로 액션 버튼이 줄바꿈 기능으로 동작한다. 문자 메시지나 카톡 채팅 화면에서 editText를 터치하면 바로 볼 수 있다.
그런데 멀티 라인 입력 필드에서 액션 버튼이 줄바꿈이 아닌 다른 액션 버튼으로 동작하게 되면 줄을 바꿀 수 있는 방법이 사라지게 되어 에러를 일으킬 수 있다. 그래서 imeOptions 속성을 시험하려면 editText의 inputType 속성에 text를 지정하거나 singleLine 속성을 true로 지정해 멀티라인 입력 기능을 제거해줘야 한다.
singleLine은 현재 xml에서 입력해보면 deprecated되어 있어 삭선이 그어져 있다. 때문에 난 내일 죽더라도 지금 무조건 singleLine을 써야 하는 상황이 아니라면 inputType을 text로 지정한 다음 imeOptions 속성을 actionSearch로 지정해서 멀티 라인 입력 기능을 제거하자.
다음은 MainActivity.java 파일의 소스코드다.
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import static android.view.inputmethod.EditorInfo.IME_ACTION_SEARCH;
public class MainActivity extends AppCompatActivity {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.edittext);
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
switch (actionId)
{
case IME_ACTION_SEARCH :
Toast.makeText(MainActivity.this, "editText ACTION_SEARCH 이벤트 호출", Toast.LENGTH_SHORT).show();
Log.e("MainActivity", "입력 내용 : " + editText.getText().toString());
break;
}
return true;
}
});
}
}
switch 문 안의 case 우측에 처음부터 IME_ACTION 까지 쳐보면 나오지 않는다.
그래서 처음에는 android.view.inputmethod.Editorinfo. 까지 치고 IME_ACTION_SEARCH를 입력하면 앞의 입력한 잡다한 것들은 지워지고 저렇게 IME_ACTION_SEARCH만 남는다.
그 외에는 토스트로 어떤 이벤트가 호출됐다는 걸 알린 다음, 로그를 통해 editText에 입력한 내용들을 확인하는 내용의 아주 간단한 코드들이다.
특이점이라면 editText 참조 변수에 setOnEditorActionListener 리스너를 추가해야 onEditorAction()을 재정의할 수 있고, 이 안에 내용을 작성해야 한다는 것 정도다.
이렇게 한 후 앱을 빌드하면 위에서 봤던 사진처럼 앱이 동작하는 걸 볼 수 있다.
'Android' 카테고리의 다른 글
[Android] GLSurfaceView의 카메라 프리뷰 화면 캡쳐하는 법 (with. AR core, OpenGL ES 2.0) (0) | 2020.07.02 |
---|---|
[Android] Google Vision API 사용 시 Requests from this Android client application <empty> are blocked 에러 해결 (0) | 2020.06.30 |
[Android] 안드로이드 KG이니시스 결제 연동하는 법 (0) | 2020.06.24 |
[Android] 다음 우편번호 API 사용하기 (0) | 2020.06.23 |
[Android] 리사이클러뷰 아이템 간 가로 / 세로 간격 조절하는 법 (0) | 2020.06.22 |