관리 메뉴

나만을 위한 블로그

[Android] 핸드폰 키보드 자판에 검색 버튼 나오게 하는 법 본문

Android

[Android] 핸드폰 키보드 자판에 검색 버튼 나오게 하는 법

참깨빵위에참깨빵_ 2020. 6. 26. 17:07
728x90
반응형

앱을 쓰다 보면 굳이 위에 있는 검색 버튼을 누르지 않아도 되도록 설정된 키보드가 올라와서 검색하기 편했던 적이 있을 것이다.

이 글에서는 돋보기 버튼이 있는 키보드 자판이 올라오게 하는 예제의 소스코드를 설명하겠다.

 

먼저 이 예제를 빌드하면 아래처럼 작동한다.

 

 

보통 키보드 자판을 보면 아래로 한 칸 띄워주는 버튼이 있는데, 예제를 보면 그 위치에 돋보기 버튼이 대신 존재하는 걸 볼 수 있다.

긴 말 필요없이 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()을 재정의할 수 있고, 이 안에 내용을 작성해야 한다는 것 정도다.

 

이렇게 한 후 앱을 빌드하면 위에서 봤던 사진처럼 앱이 동작하는 걸 볼 수 있다.

 

반응형
Comments