IT
위젯의 보조기억장치 setTag() getTag()
Dante2k™
2013. 1. 24. 12:27
반응형
안드로이드의 각 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); } }; }
반응형