메뉴 건너뛰기

조회 수 1211 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

안드로이드 단말기에는 여러 가지 키(Key)가 존재합니다. 이전 액티비티로 돌아가거나 현재 액티비티가 루트 액티비티일 경우 앱을 종료시키는 뒤로 가기 키, 볼륨 조절을 위한 볼륨 업다운 키, 홈 화면으로 이동 가능한 홈 키등 여러 가지 키 이벤트(Key Event)를 발생시켜 단말기의 특정 작업을 처리하는 경우가 많습니다.

 

안드로이드 앱 개발 과정에서도 이러한 각 키(Key)에 대한 이벤트 처리를 onKeyUp() 함수와 onKeyDown()  함수를 재정의함으로써 이벤트 처리 작업이 가능합니다. 함수명으로도 직관적으로 알수 있듯이  onKeyDown()은 키가 눌렀졌을 때 호출되며 onKeyUp() 함수는 키에서 손을 뗐을 때 호출되는 함수입니다. 

 

두 함수는 KeyCode 값과 KeyEvent 두 개의 공통된 매개변수를 인자로 받습니다. 

 

KeyCode는 KeyEvent 클래스에 정의된 상수들 중 하나로 수많은 Key와 대응됩니다. 예를들어 뒤로 가기 버튼을 눌렀을 때 KeyCode는 KeyEvent.KEYCODE_BACK 값이 되며 홈키를 눌렀을 때는 KeyEvent.KEYCODE_HOME 값이 됩니다. 자신이 특정 키에 대한 이벤트 처리를 하고 싶을 경우 해당 키와 대응되는 KeyCode 값을 알아야 합니다. 해당 내용이 있는 참조 문서는 포스팅 아래에 추가하였으니 참조 바랍니다.

 

 

 


1. 두 함수의 리턴값의 의미

onKeyUp() 함수와 onKeyDown() 함수의 리턴 타입은 boolean입니다. true를 리턴하는 경우 기존 시스템이 가지는 해당 키 이벤트에 대한 처리를 무시하겠다는 의미이며 반대로 false의 경우 개발자가 재정의한 키 이벤트 처리를 실행하고 시스템이 기존에 가지고 있던 키 이벤트 처리 루틴을 타겠다는 것을 의미합니다. 

 

만약 뒤로가기 버튼에 대한 키 이벤트를 처리할 경우 Toast 메시지만 띄우고 기존의 뒤로 가기 버튼의 동작인 이전 액티비티 이동 또는 앱 종료와 같은 기능을 무시하고자 할 경우 true로 리턴해주면 됩니다.


2. 키 이벤트(Key Event) 구현

실제로 뒤로가기 키에 대한 이벤트 처리를 하는 간단한 코드를 구현해보겠습니다.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                Log.d("KeyUP Event", "뒤로 가기 키 down");
                return true;
        }
        return false;
    }
    
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                Log.d("KeyUP Event", "뒤로 가기 키 up");
                return true;
        }
        return false;
    }
}

▼ onKeyDown() 함수와 onKeyUp() 함수를 재정의합니다. KeyCode 값이 KeyEvent.KEYCODE_BACK일 경우 로그 캣에 로그를 남기도록 하였으며 true를 리턴합니다. 뒤로 가기 키를 제외한 나머지 키 이벤트에 대한 처리는 시스템에 맡기도록 하기 위해 false를 리턴하도록 합니다. 


3. View 위젯에 대한 키 이벤트 리스너 등록하기

■ /res/layout/main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="EditText1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="EditText2"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/editText1" />
</android.support.constraint.ConstraintLayout>

▼ EditText 두 개를 배치하였습니다. 두 EditText에 Key Event에 대한 리스너를 다르게 구현하여 등록 할 것입니다.

import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.setListener();
    }

    private void setListener()
    {
        EditText editText1 = findViewById(R.id.editText1);
        EditText editText2 = findViewById(R.id.editText2);

        View.OnKeyListener keyListener1 = new View.OnKeyListener(){
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if(keyCode == KeyEvent.KEYCODE_BACK &&
                    event.getAction() == KeyEvent.ACTION_UP)
                {
                    Toast.makeText(getApplicationContext(), "이전가기 버튼 기존 시스템 키 이벤트 처리되요", Toast.LENGTH_LONG).show();
                }
                return false;
            }
        };


        View.OnKeyListener keyListener2 = new View.OnKeyListener(){
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if(keyCode == KeyEvent.KEYCODE_BACK &&
                        event.getAction() == KeyEvent.ACTION_UP)
                {
                    Toast.makeText(getApplicationContext(), "이전가기 버튼 기존 시스템 키 이벤트 처리 안되요", Toast.LENGTH_LONG).show();
                }
                return true;
            }
        };


        editText1.setOnKeyListener(keyListener1);
        editText2.setOnKeyListener(keyListener2);
    }
}

▼ key 이벤트 처리를 위해서는 View.OnKeyListener 인터페이스의 onKey() 함수를 재정의합니다. 

Listener1 클래스는 EditText1에 등록되는 리스너로 뒤로가기뒤로 가기 키를 눌렀다 뗐을 때 Toast 메시지를 띄워주고 false 값을 리턴하여 해당 EditText에 포커스 된 상태에서 뒤로 가기를 누르면 Toast 메시지를 띄우고 시스템이 기존에 가지는 뒤로 가기 이벤트도 처리를 하겠다는 것을 의미합니다. 

 

반대로 Listener2는 onKey() 함수의 리턴값이 true입니다. 이는 시스템이 가지는 뒤로 가기 이벤트 처리를 하지 않고 무시하겠다는 의미로 EditText에 포커스 된 상태에서 뒤로 가기 키를 누르면 Toast 메시자만 띄워지고 앱은 종료되지 않습니다.


List of Articles
번호 제목 날짜 조회 수
97 하이브리드 앱에서의 세션관리(로그인 상태 유지) 2018.12.27 5001
96 WebView를 사용할때 HttpClient를 이용한 Session 유지 2018.12.27 4380
95 안드로이드 - 에디트텍스트(EditText) 사용법 정리 file 2021.03.29 2755
94 WebView에서 카메라 및 이미지 업로드 (선택적용가능) file 2020.12.14 2692
93 구글맵으로 GPS 현재위치 실시간 연동하기 file 2020.12.14 2445
92 위젯 업데이트 주기 빠르게 하기 2018.10.02 2142
91 안드로이드 - 네비게이션 드로어(Navigation Drawer)를 활용하여 슬라이드 메뉴 구현하기 file 2021.04.01 1858
90 MediaPlayer 클래스 사용법 file 2018.10.02 1803
89 Android Studio에서 SQLCipher 라이브러리 추가 방법 file 2018.10.02 1776
88 안드로이드 - 날짜 및 시간 정보 입력받기 (DatePickerDialog / TimePickerDialog) file 2021.04.01 1764
87 안드로이드 WebView 에서 tel: 이 되지않는 경우. 2018.10.02 1633
86 Apk manager 이용해 Decompile (디컴파일) 하기 file 2021.03.16 1620
85 안드로이드 - BottomNavigationView 사용하여 하단 메뉴 만들기 file 2021.04.02 1439
84 Volley 로 웹요청하고 응답받기2 - Post방식 , 로그인-회원가입 (php,mysql 연동) file 2020.12.14 1431
83 안드로이드 - 타이머(Timer) 구현하기 2021.04.01 1368
82 [하이브리드앱] userAgent를 이용해서 웹 / 앱 접속 구분하기 2021.09.30 1282
81 안드로이드 - switch를 사용법 및 구현 file 2021.04.02 1280
80 안드로이드 - 텍스트뷰(TextView) 사용법 정리 file 2021.03.31 1247
» 안드로이드 - KeyEvent(키 이벤트) 처리 file 2021.04.02 1211
78 WebView 작업할때 Net::ERR_UNKNOWN_URL_SCHEME 에러 발생할때 (전화걸기,문자보내기 안된다) 2020.12.14 1067
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 Next
/ 13

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved