개인용 복습공간

[Android] 기본 이벤트 처리 본문

Android

[Android] 기본 이벤트 처리

taehwanis 2021. 5. 17. 23:52

 

 

 

사용자 간의 상호작용을 위한 간단한
이벤트 처리 과정을 다뤄보려 한다.

 

 

 

 

 

기본 이벤트 처리

컴퓨터를 사용할  프로그램이 반응하도록 사용자가 생성하는 작업이다. 키보드의 키를 누르는 것이 대표적이며, 마우스 버튼을 누르거나 마우스를 이동하는  따위가 있다.

 

 

기본 이벤트 종류
  • 클릭
    OnClickListener
    Void onClick (View v)
  • 포커스 변경
    OnFocusChangeListener
    Void onFocusChange (View v, boolean hasFocus)
  • 롱클릭
    OnLongClickListener
    Boolean onLongClick (View v)
  • 키 (특정 위치를 사용하는 경우)
    OnKeyListener
    Boolean onKey (View v, int keyCode, KeyEvent event)
  • 키 (특정 위치를 사용하지 않는 경우)
    onKeyDown (int keycode, KeyEvent event)
  • 터치
    OnTouchListener
    Boolean onTouch (View v, MotionEvent event)

 

 

 

Key 코드
  • KEYCODE_DPAD_LEFT 왼쪽 화살표
  • KEYCODE_DPAD_LEFT 왼쪽 화살표
  • KEYCODE_DPAD_RIGHT 오른쪽 화살표
  • KEYCODE_DPAD_UP 위쪽 화살표
  • KEYCODE_DPAD_DOWN 아래쪽 화살표
  • KEYCODE_DPAD_CENTER 중앙 버튼
  • KEYCODE_CALL 통화 버튼
  • KEYCODE_ENDCALL 통화 종료 버튼
  • KEYCODE_HOME 홈 버튼
  • KEYCODE_BACK 뒤로 가기 버튼
  • KEYCODE_BOLUME_UP 볼륨 업 버튼
  • KEYCODE_BOLUME_DOWN 볼륨 다운 버튼
  • KEYCODE_0 ~ KEYCODE_9 숫자 0 ~ 9
  • KEYCODE_A ~ KEYCODE_Z 알파벳 A ~ Z

키 코드 가운데 숫자, 알파벳 등의 입력은 안드로이드 버전에 따라 인식이 제한된다.

 

 

기본 이벤트 예제

기본 이벤트 레이아웃

한 화면에 여러 이벤트가 존재하는 다중 이벤트 처리를 해보려고 한다.

 

 

다음은 작성한 레이아웃이다.
activity_main.xml

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<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">
 
    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/v_gline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.50" />
 
    <Button
        android:id="@+id/button01"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:text="Click"
        android:textAllCaps="false"
        app:layout_constraintEnd_toStartOf="@+id/v_gline"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
    <Button
        android:id="@+id/button02"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:text="Long Click"
        android:textAllCaps="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@+id/v_gline"
        app:layout_constraintTop_toTopOf="parent" />
 
    <EditText
        android:id="@+id/editText01"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button02" />
 
    <EditText
        android:id="@+id/editText02"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText01" >
 
        <requestFocus/>
 
    </EditText>
 
    <TextView
        android:id="@+id/textView01"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:background="#BDBDBD"
        android:text="TouchEvent Test"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText02" />
 
</androidx.constraintlayout.widget.ConstraintLayout>
cs

constraintlayout 에서는 기준 위치 설정, 비율 지정 등이 필요할 때 Guideline 을 사용한다.
레이아웃 상의 초기 포커스 변경이 필요한 경우, 포커스를 가지는 구성요소 안에
<requestFocus />를 추가한다.

 

 

다음은 코드 작성이다. 자세한 건 주석으로 작성해 두었다.
MainActivity.java

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
 
//필요한 리스너를 모두 작성
public class MainActivity extends AppCompatActivity implements View.OnClickListener,
                                                               View.OnLongClickListener,
                                                               View.OnFocusChangeListener,
                                                               View.OnKeyListener,
                                                               View.OnTouchListener {
 
    Button btn01, btn02;
    EditText edit01, edit02;
    TextView text01;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        btn01 = (Button) findViewById(R.id.button01);
        btn01.setOnClickListener(this); //클릭리스너 등록
 
        btn02 = (Button) findViewById(R.id.button02);
        btn02.setOnLongClickListener(this); //롱클릭리스너 등록
 
        edit01 = (EditText) findViewById(R.id.editText01);
        edit01.setOnFocusChangeListener(this); //포커스리스너 등록
 
        edit02 = (EditText) findViewById(R.id.editText02);
        edit02.setOnKeyListener(this); //키리스너 등록
 
        text01 = (TextView) findViewById(R.id.textView01);
        text01.setOnTouchListener(this); //터치리스너 등록
    }
 
    @Override
    public void onClick(View v) {
        Toast.makeText(this"onClick!", Toast.LENGTH_LONG).show(); //토스트 알림 출력
    }
 
    @Override
    public boolean onLongClick(View v) {
        Toast.makeText(this"onLongClick!", Toast.LENGTH_LONG).show(); //출력한 메세지 작성, 메세지 길이(Toast.LENGTH_LONG)
        return false;
    }
 
    @Override
    public void onFocusChange(View v, boolean hasFocus) { //포커스 변경이 발생했을 때 호출
        String s = "";
        if (hasFocus) { //포커스를 얻은 경우
            ((EditText) v).setText("");
        } else { //포커스를 잃은 경우
            s = edit01.getText().toString();
            edit01.setText(s + "+ focus change");
        }
    }
 
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) { //키 이벤트 발생시
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Toast.makeText(this"KEYCODE_BACK", Toast.LENGTH_LONG).show(); //back 키
        }
        if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { //볼륨키
            text01.setText("Volume Up");
        }
        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
            text01.setText("Volume Down");
        }
        return false;
    }
 
 
    @Override
    public boolean onTouch(View v, MotionEvent event) { //터치 이벤트 발생시
        if (event.getAction() == MotionEvent.ACTION_DOWN) { //터치 할 때
            text01.setText("ACTION_DOWN");
            return true;
        }
        if (event.getAction() == MotionEvent.ACTION_MOVE) { //터치한 상태로 움직일 때
            text01.setText("ACTION_MOVE");
            return false;
        }
        if (event.getAction() == MotionEvent.ACTION_UP) { // 떼는 우
            text01.setText("ACTION_UP");
            return false;
        }
        return false;
    }
}
cs

 

 

 


 

 

 

기본 이벤트 실행화면

클릭, 롱클릭 이벤트 실행화면

꾹 눌러야 onLongClick 이벤트가 발생한다.

 

 

포커스 변경 이벤트 실행화면

다른 editText로 포커스 이동할 시 작동한다. 다시 포커스를 획득하면 기존 데이터를 삭제한다.

 

 

키 이벤트 실행화면

볼륨 업, 다운이나 Back 키를 누르면 작동하는 이벤트이다.

 

 

터치 이벤트 실행화면

TextView에서 작동하는 터치 이벤트이다.

Comments