728x90

안드로이드는 이벤트기반프로그래밍이다.
xml로 외부를 표현해도 내부로직이 아직 존재하지 않는다면 그냥 껍데기일 뿐이다.
이벤트기반프로그래밍이 무엇인지에 대해서 알고싶다면 여기를 참조하라.

OnClickListener
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
android:weightSum="1"
tools:context="com.example.jiharu.trackingtest.MainActivity">

<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="TextView" />

<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>

ClickListener는 클릭했을 때 발생하는 이벤트이다.

클릭의 정의를 정확히 알아야하는데 마우스로 눌렸다가 땠을때 발생하는 이벤트이다.

위의 xml을 한번 확인해보라. 간단한 레이아웃이다.



필자가 만들것은 버튼을 눌렸을때 TextView에 누른 횟수를 표시하는 예제이다. 자바 코드를 보자.


package com.example.jiharu.trackingtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
private TextView tv;
private Button btn;
private int count;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv.setText(count++);
}
});
}
}


많이 했던 예제이므로 어렵지 않다.

중요한건 setText메소드는 무조건 String형이 들어가야하므로 빈문자열을 붙혀서 문자열로 바꿔줘야한다.

한번 테스트 해보자.



제대로 작동하는걸 확인할 수 있다.


OnTouchListener


btn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
tv.setText("DOWN");
break;
case MotionEvent.ACTION_UP:
tv.setText("UP");
break;
case MotionEvent.ACTION_MOVE:
tv.setText("MOVE");
break;
}
return false;
}
});


터치리스너는 터치했을 때 발생하는 이벤트이다.

터치와 클릭의 차이는 무엇일까? 그게 궁금하다면 한번 실행해 보면된다.

터치 했을때의 상태는 MotionEvent의 static 필드로 3종류(실제로는 더있음)를 선택할 수 있다.


MotionEvent


ACTION_DOWN : 터치를 누르는 순간

ACTION_UP : 터치를 때는 순간

ACTUIB_MOVE : 터치되고 있는 순간



Touch리스너와 Click리스너의 차이점은 Touch는 민감하게 반응하고 Click은 눌렀다가 떼는 순간에만 반응 한다는 것이다.

따라서 무엇가를 닿거나 닿고있는동안 발생할 이벤트는 Touch로, 눌렀을때 발생하는 이벤트는 Click으로 만드는 것이 적절하다.


OnLongClickListener


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv.setText("Click");
}
});
btn.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
tv.setText("LongClick");
return false;
}
});
}


LongClickListener는 ClickListener와는 달리 누르는 순간 발생한다.

Click리스너는 눌렀다 떄는 순간 발생한다.

또한 ClickListener는 눌렀다 때면 바로 발생하지만 LongClickListener는 1초 동안 누르고 있으면 발생한다.

위는 그 예제이다.



반환 타입은 크게 신경안써도 된다. true로 주던 false로 주던 별 크게 관계는 없다.

물론 경우에 따라서 신경써야할때도 존재는 하는데 그건 매우 나중의 이야기이다.




+ Recent posts