반응형
안드로이드의 각 View를 확장한 위젯에는 setTag(Object obj)와 getTag() 라는 메소드를 제공합니다. Object를 담을 수 있는 공간을 제공하기 때문에 필요에 따라서는 class단위의 정보도 간단히 저장했다가 무엇을 저장했는지 정확하게 알 수 있다면 명시적인 캐스팅을 통해서 해당 정보를 다시 추출할 수 있습니다.
간단히 예제를 작성해 보았다.
위의 코드에서 보는 바와 같이 명시적으로 데이터 타입을 정확하게 알고 있어야 정상적으로 Tag에 저장된 데이터를 복구 할 수 있습니다.
위의 방법으로 화면에 보여주는 데이터와 내부에 저장해서 숨겨놓은 데이터를 분리하여 콘트롤 할 수 있으니 이 얼마나 편리한가...
이 메소드를 제공하는 것을 모른다면 각각의 View를 모두 Custom하게 제작하여 Tag와 같은 기능을 사용할 수 있도록 할 수도 있겠으나... 이미 편리하게 사용하라고 만들어놓은 것이 있으니 이를 사용하면 되겠습니다.
**** 추가 작성 ****
package com.ubank.ubpos.activity.data.menu;
import java.util.Calendar;
import com.ubank.ubpos.activity.MenuActivity;
import com.ubank.ubpos.common.CommonUtil;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.DatePicker;
public class DlgFrgMenu extends DialogFragment {
private static final String ARGS_INNER_ID = "inner_id";
private static final String ARGS_YEAR = "year";
private static final String ARGS_MONTH = "month";
private static final String ARGS_DAY = "day";
public static final int DIALOG_ID_DISCOUNT_START_DATE = 3000001;
public static final int DIALOG_ID_DISCOUNT_END_DATE = 3000002;
/**
* 오늘 날짜를 기준으로 데이트피커다이얼로그를 리턴한다.
*
* @param dialogId
*
* @return {@link DlgFrgMenu}
*/
public static DlgFrgMenu newInstance(int dialogId) {
DlgFrgMenu dialog = new DlgFrgMenu();
Bundle bundle = new Bundle();
bundle.putInt(ARGS_INNER_ID, dialogId);
dialog.setArguments(bundle);
return dialog;
}
/**
* param으로 넘어오는 날짜를 기준으로 DatePickerDialog를 리턴한다.
*
* @param dialogId
* @param strDate 문자열형태 '2013-04-31'
* @return {@link DlgFrgMenu}
*/
public static DlgFrgMenu newInstance(int dialogId, String strDate) {
DlgFrgMenu dialog = new DlgFrgMenu();
Bundle bundle = new Bundle();
bundle.putInt(ARGS_INNER_ID, dialogId);
if (strDate != null && strDate.length() == 10) {
String[] arDate = strDate.split("-");
bundle.putInt(ARGS_YEAR, Integer.parseInt(arDate[0]));
bundle.putInt(ARGS_MONTH, Integer.parseInt(arDate[1])-1);
bundle.putInt(ARGS_DAY, Integer.parseInt(arDate[2]));
}
dialog.setArguments(bundle);
return dialog;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final int inner_id = getArguments().getInt(ARGS_INNER_ID);
final int year = getArguments().getInt(ARGS_YEAR, Calendar.getInstance().get(Calendar.YEAR));
final int month = getArguments().getInt(ARGS_MONTH, Calendar.getInstance().get(Calendar.MONDAY));
final int day = getArguments().getInt(ARGS_DAY, Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
switch (inner_id) {
case DIALOG_ID_DISCOUNT_START_DATE:
case DIALOG_ID_DISCOUNT_END_DATE:
return new DialogDatePickerDialog(getActivity(), dateOnDateSetListener, year, month, day);
}
return null;
}
private class DialogDatePickerDialog extends DatePickerDialog
implements DialogInterface.OnKeyListener {
public DialogDatePickerDialog(Context context, OnDateSetListener callBack,
int year, int monthOfYear, int dayOfMonth) {
super(context, callBack, year, monthOfYear, dayOfMonth);
}
/**
* 다이얼로그의 OutSide 클릭이벤트 처리방법
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Rect dialogBounds = new Rect();
getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
this.dismiss();
((MenuActivity)getActivity()).doSetDate(getTag(), "");
}
return super.dispatchTouchEvent(ev);
}
/**
* 하드웨어 뒤로가기 키를 처리하는 방법
*/
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.KEYCODE_BACK) {
((MenuActivity)getActivity()).doSetDate(getTag(), "");
}
return false;
}
/**
* 뒤로가기 버튼 이벤트 처리방법
*/
@Override
public void onBackPressed() {
((MenuActivity)getActivity()).doSetDate(getTag(), "");
super.onBackPressed();
}
}
/**
* 날짜선택다이얼로그에서 '설정'을 눌렀을 때의 이벤트 처리방법
*/
private DatePickerDialog.OnDateSetListener dateOnDateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
String strDate = CommonUtil.dfSybolsFour.format(year)
+ "-" + CommonUtil.dfSybolsTwo.format(monthOfYear+1)
+ "-" + CommonUtil.dfSybolsTwo.format(dayOfMonth);
((MenuActivity)getActivity()).doSetDate(getTag(), strDate);
}
};
}
반응형