-
[Android] Custom EventListener 사용하기프로그래밍/Android 2018. 10. 2. 11:12
오늘 포스팅 주제는 커스텀 리스너 사용법에 관한 이야기 인데요, 일반적으로 사용하는 리스너 외에 원하는 형태와 상황에 맞추어 사용 가능하도록 커스텀 리스너를 생성하여 사용하는 법을 알아보고자 합니다.
Custom Listener 사용하기
이번 예제는 이전에 'Dialog 사용하기' 예제를 조금 수정하여 진행할 예정이기 때문에 예제를 따라하길 원하시는 분은 이전 포스팅의 내용을 먼저 작성하신 후에 보시면 되겠습니다.
Dialog 사용하기
예제에서는 MainActivity에서 Dialog의 버튼 클릭 이벤트에 대한 리스너를 달아, MainActivity에서 후 처리를 할 수 있도록 리스너를 구성해보도록 하겠습니다.
EndDialog.java
package rebuild.com.dialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.TextView;
public class EndDialog extends Dialog implements View.OnClickListener {
private Context mContext;
private TextView btn_cancel;
private TextView btn_ok;
private OnDialogButtonClickListener mOnDialogButtonClickListener;
public interface OnDialogButtonClickListener {
void onDialogButtonClick(View view);
}
public void setOnDialogButtonClickListener(OnDialogButtonClickListener mListener) {
mOnDialogButtonClickListener = mListener;
}
public EndDialog(@NonNull Context context) {
super(context);
mContext = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_end);
btn_cancel = (TextView) findViewById(R.id.btn_cancel);
btn_ok = (TextView) findViewById(R.id.btn_ok);
btn_cancel.setOnClickListener(this);
btn_ok.setOnClickListener(this);
}
@Override
public void onClick(View v) {
mOnDialogButtonClickListener.onDialogButtonClick(v);
}
}
소스만 보시고는 잘 이해가 되지 않으시겠죠?
먼저, EventListener를 인터페이스로 작성을 해주어야 합니다. 인터페이스 내에 작성되는 함수는 여러 개 생성하셔도 되며, 파라미터 또한 원하시는 데이터의 형태로 작성하시면 되겠습니다. 다만, 작성된 함수들은 인터페이스를 사용하는 클래스에 모두 구현이 되어야 하므로, 여러 클래스에서 사용하게 될 경우, 불필요하게 작성되지 않도록 주의해주시기 바랍니다.
인터페이스 작성이 모두 끝나셨다면, 작성된 인터페이스를 변수로 만들어주시면 됩니다. 이후에, 외부에서 인터페이스를 사용할 수 있도록 setEventListener(EventListener listener)를 달아주시면 됩니다.
설명하다 보니 글이 길어졌는데요. 간단하게 요약하면,
1. EventListener를 인터페이스로 정의한다.
2. 정의된 인터페이스를 변수로 선언한다.
3. setOnEvnetListener(EventListener listener)를 작성한다.
위의 예제에서는 다이얼로그의 버튼이 클릭 되었을 때, 인터페이스의 onDialogButtonClick() 함수에 View 정보를 넘겨주고 있습니다. 그럼 MainActivity에서 어떻게 처리를 해야 할지 보도록 하겠습니다.
MainActivity.java
package rebuild.com.dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, EndDialog.OnDialogButtonClickListener {
private Context mContext;
private Button btn_end;
private EndDialog mEndDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_end = (Button) findViewById(R.id.btn_finish);
btn_end.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_finish:
mEndDialog = new EndDialog(this);
mEndDialog.setOnDialogButtonClickListener(this);
mEndDialog.setCancelable(false);
mEndDialog.show();
break;
}
}
@Override
public void onDialogButtonClick(View view) {
switch (view.getId()) {
case R.id.btn_cancel:
mEndDialog.dismiss();
break;
case R.id.btn_ok:
finish();
break;
}
}
}
다이얼로그 호출 시에 아까 만들었던 setEventListener를 통해 리스너를 등록해주시면 됩니다. 리스너를 등록하면, 인터페이스에 정의하였던 함수들을 Override해주어야 합니다. 여기에 후 처리들을 해주시면 되겠습니다.!
쓰다보니, 글이 길어진 것 같지만 소스를 작성해보시면 생각보다 간단하게 구현이 가능합니다. 프로젝트를 진행하다 보면 많이 사용하게 될 내용이라 프로젝트 구조 잡으실 때도 도움이 많이 되실 겁니다.
'프로그래밍 > Android' 카테고리의 다른 글
[Android] 해상도별 레이아웃 대응에 대한 고찰 (5) 2018.10.23 [Android] FloatingActionButton 사용하기 (4) 2018.10.15 [Android] Dialog 사용하기 (0) 2018.09.27 [Android] TabLayout과 ViewPager (4) 2018.09.19 [Android] ListView 사용하기 (2) 2018.09.14