본문 바로가기

IT

위젯의 보조기억장치 setTag() getTag()

반응형

 안드로이드의 각 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);
		}
	};
}
반응형