티스토리 뷰

방법 1: 익명 클래스로 리스너 바로 전달

동작 개요

텍스트 뷰 클릭 시 텍스트 뷰의 배경색을 GREEN으로 변경

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv"
    android:layout_width="match_parent"
    android:laytout_height="match_parent"
    android:text="♥"
    android:textSize="50sp"
    android:gravity="center" />

 

MainActivity.java

  • t.setOnClickListener 호출 시, OnClickListener 객체를 직접 익명 클래스로 구현하여 즉시 전달
  • 한 번만 사용되는 이벤트 리스너를 즉석으로 정의할 때 사용하는 방식
package com.example.test;

import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView t = findViewById(R.id.tv);
        
        t.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setBackgroundColor(Color.GREEN);
            }
        });
    }
}

 

방법 1: 익명 클래스로 리스너 바로 전달 실행


방법 1+: 람다식으로 표현하기

MainActivity.java

  • setOnClickListener 메서드는 View.OnClickListener 인터페이스를 구현한 객체만을 받을 수 있도록 설계됨
  • View.OnClickListener은 onClick이라는 추상 메서드가 하나만 있는 인터페이스
  • 람다식은 함수형 인터페이스(추상 메서드가 하나만 있는 인터페이스)에 대한 익명 클래스 생성을 간결하게 표현할 수 있는 방식
package com.example.test;

import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView t = findViewById(R.id.tv);
        
        t.setOnClickListener(v -> v.setBackgroundColor(Color.GREEN)); 
    }
}

 

결과는 방법 1과 같음


방법 2: 리스너를 로컬 변수로 정의하여 전달

동작 개요

텍스트 뷰 클릭 시 텍스트 뷰의 배경색을 BLUE로 변경

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv"
    android:layout_width="match_parent"
    android:laytout_height="match_parent"
    android:text="♥"
    android:textSize="50sp"
    android:gravity="center" />

 

MainActivity.java

  • 리스너 객체를 별도의 변수 l로 미리 정의한 후, t.setOnClickListener(l)에서 전달
  • 리스너 객체를 여러 곳에서 재사용하거나 명확하게 관리하고 싶을 때 사용할 수 있는 방식
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView t = findViewById(R.id.tv);
        
        View.OnClickListener l = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setBackgroundColor(Color.BLUE);
            }
        };
        
        t.setOnClickListener(l);
    }
}

방법 2: 리스너를 변수로 선언하여 전달 실행


방법 2+: 람다식으로 표현하기

MainActivity.java

  • setOnClickListener 메서드는 View.OnClickListener 인터페이스를 구현한 객체만을 받을 수 있도록 설계됨
  • View.OnClickListener은 onClick이라는 추상 메서드가 하나만 있는 인터페이스
  • 람다식은 함수형 인터페이스(추상 메서드가 하나만 있는 인터페이스)에 대한 익명 클래스 생성을 간결하게 표현할 수 있는 방식
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView t = findViewById(R.id.tv);
        
        View.OnClickListener l = (v) -> {v.setBackgroundColor(Color.BLUE); };
        
        t.setOnClickListener(l);
    }
}

 

결과는 방법 2와 같음


방법 3: 리스너를 별도의 클래스로 분리

동작 개요

텍스트 뷰 클릭 시 텍스트 뷰의 배경색을 YELLOW로 변경

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv"
    android:layout_width="match_parent"
    android:laytout_height="match_parent"
    android:text="♥"
    android:textSize="50sp"
    android:gravity="center" />

 

MainActivity.java

  • t.setOnClickListener()에서 직접 설정한 별도의 클래스 사용
package com.example.test;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView t = findViewById(R.id.tv);
        t.setOnClickListener(new MyTextView_ClickListener());
    }
}

 

MyTextView_ClickListener.java

  • OnClickListener 인터페이스를 구현한 별도의 파일에서 리스너 정의
  • 해당 리스너 클래스를 여러 곳에서 재사용하기 편함
package com.example.test;

import android.graphics.Color;
import android.view.View;

public class MyTextView_ClickListener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        v.setBackgroundColor(Color.YELLOW);
    }
}

방법 3: 리스너를 별도의 클래스로 분리 실행


방법 4: 액티비티 자체에 리스너 인터페이스 구현

동작 개요

텍스트 뷰 클릭 시 텍스트 뷰의 배경색을 CYAN으로 변경

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv"
    android:layout_width="match_parent"
    android:laytout_height="match_parent"
    android:text="♥"
    android:textSize="50sp"
    android:gravity="center" />

 

MainActivity.java

  • implements View.OnClickListener로 해당 인터페이스 구현
  • t.setOnClickListener을 통해 액티비티 자체를 리스너로 설정하여 MainActivity 내에서 클릭 이벤트 처리
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    TextView t;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        t = findViewById(R.id.tv);
        
        t.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        v.setBackgroundColor(Color.CYAN);
    }
}

방법 4: 액티비티 자체에 리스너 인터페이스 구현 실행

공지사항
링크