프로그래밍/android

[kotlin] 커스텀 리스너(Custom Listener)를 람다(Lamda) 형식으로 사용하기

-샤리- 2021. 1. 8. 14:22

[java에서의 사용방법]

 

java에서는 콜백 즉, 어떠한 이벤트를 받아 오기 위해 리스너를 사용하는데 형태는 아래와 같다.

 

1. DataChangeListener 라는 커스텀 리스너 interface 생성 (MyCustomView.java)

public class MyCustomView extends View {

    DataChangeListener dataChangeListener;

    interface DataChangeListener {
        void onChanged(int index, String value);
    }

    public MyCustomView(Context context) {
        super(context);
    }

    public void setOnDataChangeListener(DataChangeListener listener) {
        this.dataChangeListener =  listener;
    }
}

 

2. DataChangeListener 이벤트 수신 (TestActivity.java)

class TestActivity extends AppCompatActivity {

    MyCustomView myCustomView;

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

        myCustomView = new MyCustomView(this);
        myCustomView.setOnDataChangeListener(new MyCustomView.DataChangeListener(){
            @Override
            public void onChanged(int index, String value) {
                Log.d("tag", String.format("index=[%d], value=[%s]"));
            }
        });
    }
}

 

 

[Kotlin에서의 이벤트 수신 방법]

 

위의 DataChangeListener 이벤트 수신 방식을 코틀린 코드로 적용해 보면 아래와 같다. (TestActivity.kt)

class TestActivity : AppCompatActivity(){

    lateinit var myCustomView: MyCustomView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        myCustomView = MyCustomView(this)
        myCustomView.setOnDataChangeListener(object : MyCustomView.DataChangeListener {
            override fun onChanged(index: Int, value: String?) {
                Log.d("tag", "index=[$index], value=[$value]")
            }
        })
    }
}

 

 

 

[kotlin에서 커스텀 리스너를 람다 형식으로 사용하기]

 

1. 위의 MyCustomView.java를 kotlin 코드로 바꿔보자. (MyCustomView.kt)

class MyCustomView: View {

    lateinit var dataChangeListener: DataChangeListener

    interface DataChangeListener{
        fun onChanged(index: Int, value: String)
    }

    constructor(context: Context?) : this(context, null){
    }

    constructor(context: Context?, attributeSet: AttributeSet?) : this(context, attributeSet, 0) {
    }

    constructor(context: Context?, attributeSet: AttributeSet?, defStyleAttr: Int?) : super(context, attributeSet, defStyleAttr!!) {

    }

    fun setOnDataChangeListener(listener: (Int, String) -> Unit) {
        this.dataChangeListener = object : DataChangeListener{
            override fun onChanged(index: Int, value: String) {
                listener(index, value)
            }
        }
    }
}

 

2. DataChangeListener 이벤트를 lamda 형식으로 받아보자. (TestActivity.kt)

class TestActivity : AppCompatActivity(){

    lateinit var myCustomView: MyCustomView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        myCustomView = MyCustomView(this)
        
        /*
        myCustomView.setOnDataChangeListener(object : MyCustomView.DataChangeListener {
            override fun onChanged(index: Int, value: String?) {
                Log.d("tag", "index=[$index], value=[$value]")
            }
        })
        */
        
        myCustomView.setOnDataChangeListener { index, value ->
            Log.d("tag", "index=[$index], value=[$value]")
        }
    }
}