Android (안드로이드)

[Android] 이벤트 리스너 / onClick / onLongClick Listener 사용 예제

Oscar:) 2022. 8. 26. 18:35

 

모든 앱은 사용자와 상호 작용이 가능해야 한다.

 

가장 기본적으로 생각해볼 수 있는 것은,

사용자가 앱 내 요소를 터치하는 것부터 시작된다.

 

사용자와의 상호 작용을 통해 앱에서는 다양한 효과를 낼 수 있다.

 

 

이번 포스팅에서는 안드로이드의 이벤트 리스너에 대해 알아보자.

 

 


 

이벤트 리스너

 

이벤트 리스너는 사용자와의 상호 작용을 보다 쉽게 도와주는 인터페이스이다.

 

 

공식문서에서는 다음과 같이 설명한다.

 

이벤트 리스너란 View 클래스 내에 있는 인터페이스이며,
콜백 메서드를 가지고 있다.

이러한 메서드는 리스너가 등록된 뷰가 사용자 상호작용으로 인해
UI 내 항목과 함께 트리거되었을 때 Android 프레임워크에 의해 호출된다.

 

콜백 메서드의 종류는 다음과 같다.

 

· onClick()

· onLongClick()

· onFocusChange()

· onKey()

· onTouch()

· onCreateContextMenu()

  등

 

 

위 여러 콜백 메서드 중에서, 자주 사용하는

onClick(), onLongClick()

2개의 메서드에 대해 알아보자.

 

(이외의 메서드는 해당 기능을 사용할 때 따로 포스팅하겠다)

 


 

onClick()

 

가장 흔하게 사용되는 메서드이며, 사용자의 터치에 의해 호출된다.

 

버튼에 주로 사용하지만, 리스너는 모든 View 를 대상으로 적용되기 때문에

TextView, ImageView 등 모든 View 에 적용될 수 있다.

 

 

onClick() 메서드 호출을 확인하기 위해서,

버튼을 터치하면 터치 횟수가 텍스트로 표시되게끔 구현해 보겠다.

 

먼저, TextView 와 Button 을 생성해준다.

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click : 0"
        android:textSize="35dp"
        />

    <Button
        android:id="@+id/button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="+1 버튼"
        android:textSize="25dp"
        />

각 View 의 위치는 각자 입맛대로 세팅하기 바란다. 

 

 

레이아웃은 이렇게 생겼다.

 

 

다음으로, java 파일을 작성해주자.

 

TestActivity.java

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class TestActivity extends AppCompatActivity {

    int clickNum = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        TextView textView = findViewById(R.id.textView);
        Button button_1 = findViewById(R.id.button_1);

        button_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                clickNum += 1;
                textView.setText("Click : " + clickNum);

            }
        });

    }
}

 

clickNum 라는 변수를 선언해주고,

onClick 메서드 안에 연산과 텍스트 적용을 작성해주었다.

 

터치를 할 때마다 clickNum 가 1씩 더해지며

TextView 에 적용될 것이다.

 

 

결과는 다음과 같다.

 

의도한 대로 잘 적용된 것을 확인할 수 있다.

 

 


 

onLongClick()

 

해당 View 를 길게 터치하였을 때.

즉, 꾹 누르고 있을 때 호출된다.

 

 

위 예제에 버튼을 하나 더 추가하여 구현해보자.

    <Button
        android:id="@+id/button_10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="+10 버튼"
        android:textSize="25dp"
        />

 

레이아웃은 이렇게 생겼다.

 

 

java 파일을 수정해주자.

 

TestActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        TextView textView = findViewById(R.id.textView);
        Button button_1 = findViewById(R.id.button_1);
        Button button_10 = findViewById(R.id.button_10);

        button_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                clickNum += 1;
                textView.setText("Click : " + clickNum);
            }
        });

        button_10.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                clickNum += 10;
                textView.setText("Click : " + clickNum);
                return false;
            }
        });

    }

 

onLongClick() 메서드는 boolean 형태의 리턴 값을 받는다.

기본 값은 false 로 세팅되어 있다.

 

 

지금은 버튼을 2개로 분리하였지만,
동일한 View 에 onClick(), onLongClick() 메서드를 함께 사용할 때
리턴 값을 이용하여 구분할 수 있다.

 

· return false

해당 View 를 길게 누르면 onLongClick() 메서드 호출.
누르던 손을 떼면 onClick() 메서드 호출.

즉, 2개의 메서드가 모두 호출됨.

 

· return true

해당 View 를 길게 눌렀다가 손을 떼어도,
onLongClick() 메서드만 호출됨.

 

 

결과는 다음과 같다.

 

+1 버튼을 클릭하면 숫자가 1씩 늘어나고,

+10 버튼을 길게 클릭하면 숫자가 10씩 늘어난다.

 

 

 


 

이번 포스팅에서는 이벤트 리스너 중,

onClick(), onLongClick() 메서드에 대해 알아보았다.

 

사용자의 터치에 의한 이벤트는 무리 없이 만들 수 있을 것이다.