[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]")
}
}
}
'프로그래밍 > android' 카테고리의 다른 글
[kotlin] 안드로이드 권한처리 onRequestPermissionsResult (한번에 여러개 요청, 다시묻지않기 체크) (0) | 2021.01.14 |
---|---|
[kotlin] for문 다양한 사용법 (0) | 2021.01.12 |
[android] 강제 회전 시키기 #screenOrientation (portrait <---> landscape) (0) | 2021.01.06 |
[android] 안드로이드 ImageView gif 적용하기 (feat. Glide) (0) | 2020.12.16 |
[kotlin] 특정 날짜가 속해있는 달에서 '특정 날짜와 같은 요일'의 날짜 구하기 (0) | 2020.12.14 |