리스너 인터페이스를 구현하여 이벤트 처리 (Listener Interface)

Dora·2020년 11월 11일
0

Chap7. 인터페이스 기초04- 이벤트 (Event)
패키지명 : chap7_prac, chap7_prac2

chap7_prac

유형1. 별도의 리스너 인터페이스 구현 클래스 작성
유형2. Activity가 리스너 인터페이스 직접 구현
유형4. 익명 내부 클래스로 구현 - 별도의 클래스 없이 인터페이스에서 직접 객체 생성
유형5. 익명 내부 클래스의 임시 객체로 구현 - 객체 이름 없이 인터페이스 구현 및 등록

유형1. 별도의 리스너 인터페이스 구현 클래스 작성

public class MainActivity extends AppCompatActivity {

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

        Button button1 = findViewById(R.id.button);

        MyClick myClick = new MyClick();    //인터페이스는 대문자로 시작, 내부 구현 메소드는 소문자로 시작
        button1.setOnClickListener(myClick);
    }

    class MyClick implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "유형1", Toast.LENGTH_SHORT).show();
        }
    }
}

유형2. Activity가 리스너 인터페이스 직접 구현

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

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

        Button button2 = findViewById(R.id.button2);

        button2.setOnClickListener(this);   // 객체를 만들 필요없이 자기자신 호출

    }

    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "유형2", Toast.LENGTH_SHORT).show();
    }
}

유형4. 익명 내부 클래스로 구현 - 별도의 클래스 없이 인터페이스에서 직접 객체 생성

public class MainActivity extends AppCompatActivity {

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

        Button button3 = findViewById(R.id.button3);

        button3.setOnClickListener(myClickListener);
    }

    final View.OnClickListener myClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "유형4", Toast.LENGTH_SHORT).show();
        }
    };
}

유형5. 익명 내부 클래스의 임시 객체로 구현 - 객체 이름 없이 인터페이스 구현 및 등록

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    // implements View.OnClickListener 는 유형2

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

        Button button4 = findViewById(R.id.button4);

        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "유형5", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

전체 코드

  • MainActivity.java
// 유형1. 별도의 리스너 인터페이스 구현 클래스 작성
// 유형2. Activity가 리스너 인터페이스 직접 구현
// 유형3. 뷰를 직접 작성할 경우 뷰에 리스너 인터페이스 구현
// 유형4. 익명 내부 클래스로 구현 - 별도의 클래스 없이 인터페이스에서 직접 객체 생성
// 유형5. 익명 내부 클래스의 임시 객체로 구현 - 객체 이름 없이 인터페이스 구현 및 등록

package ddwucom.mobile.chap7_prac;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    // implements View.OnClickListener 는 유형2

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

        Button button1 = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);
        Button button3 = findViewById(R.id.button3);
        Button button4 = findViewById(R.id.button4);

        // 유형1. 별도의 리스너 인터페이스 구현 클래스 작성
        MyClick myClick = new MyClick();    //인터페이스는 대문자로 시작, 내부 구현 메소드는 소문자로 시작
        button1.setOnClickListener(myClick);

        // 유형2. Activity가 리스너 인터페이스 직접 구현
        button2.setOnClickListener(this);   // 객체를 만들 필요없이 자기자신 호출

        // 유형4. 익명 내부 클래스로 구현 - 별도의 클래스 없이 인터페이스에서 직접 객체 생성
        button3.setOnClickListener(myClickListener);

        // 유형5. 익명 내부 클래스의 임시 객체로 구현 - 객체 이름 없이 인터페이스 구현 및 등록
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "유형5", Toast.LENGTH_SHORT).show();
            }
        });
    }

    // 유형1. 별도의 리스너 인터페이스 구현 클래스 작성
    class MyClick implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "유형1", Toast.LENGTH_SHORT).show();
        }
    }

    // 유형2. Activity가 리스너 인터페이스 직접 구현
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "유형2", Toast.LENGTH_SHORT).show();
    }

    // 유형4. 익명 내부 클래스로 구현 - 별도의 클래스 없이 인터페이스에서 직접 객체 생성
    final View.OnClickListener myClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "유형4", Toast.LENGTH_SHORT).show();
        }
    };
}
  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="별도의 리스너 인터페이스 구현"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.646"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="Activity가 직접 구현"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="익명 내부 클래스로 구현"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button2" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="익명 내부 클래스의 임시객체로 구현"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button3" />
</androidx.constraintlayout.widget.ConstraintLayout>

chap7_prac2

// 유형3. 뷰를 직접 작성할 경우 뷰에 리스너 인터페이스 구현

activity_main.xml을 사용하지않고 Custom View를 작성.
커스텀뷰는 touchListener를 실행하는 뷰를 포함한다.

앱을 실행하면 노란색인 커스텀뷰가 뜨고 해당 뷰를 터치하면 onTouch 메소드가 실행되어 토스트를 띄운다.

즉, 커스텀뷰에 "implement ~리스너"
메인 엑티비티에서 setOn~리스너(커스텀뷰)로 구현.

전체 코드

  • MainActivity.java
package ddwucom.mobile.chap7_prac2;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyView view = new MyView(this);
        view.setOnTouchListener(view);
        setContentView(view);
    }

    class MyView extends View implements View.OnTouchListener {
        public MyView(Context context) {
            super(context);
        }

        //        @Override
        protected void onDraw(Canvas canvas) {
//            super.onDraw(canvas);
            canvas.drawColor(Color.YELLOW);
        }

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            Toast.makeText(MainActivity.this, "유형3", Toast.LENGTH_SHORT).show();
            return false;
        }
    }
}
profile
Lv.1 개발자

0개의 댓글