1. 레이아웃 xml 에서 리스트뷰에 android:scrollbars="none" 추가

2. 소스에서 ListView.setVerticalScrollBarEnabled(false); 추가

Posted by Rcen_J
,
젤리빈으로 롬업데이트가 활발한 요즘, 개발자들은 이전보다 더 많은 것을 신경쓰고 이벤트처리에 신경을 써야 합니다. 가장 많은 골머리를 썩는 것중에 하나가 소프트버튼 또는 하드버튼으로 입력하는 취소처리, 다이얼로그의 OutSide를 클릭하여 취소하는 경우의 이벤트 처리가 그것일 겁니다. 그중에서 DatePickerDialog는 기본적으로 Positve버튼과 Cancel버튼이 기본적으로 달려있고, Positive버튼의 이벤트 처리는 다이얼로그 생성자에서 기본적으로 입력을 받습니다.
DatePickerDialog dialog = 
new DatePickerDialog(getActivity(), dateOnDateSetListener, year, month, day);
요런식으로 말이죠..dateOnDateSetListener에서 처리를 합니다. 그럼 취소버튼의 이벤트는 어떨까요.. 이번에 프로그램을 하나 만들면서 취소를 눌렀을 때 아예 날짜를 삭제하는 기능을 넣고 싶었습니다. 그러던중... 이런저런 많은 방법이 무수히 많았습니다만.. 일단 가장 기초적으로 해결해 보았습니다. 위의 코드에 아래의 코드를 추가합니다.
// 취소버튼을 직접 다시 생성하는 방법으로 취소버튼의 이벤트를 해결
dialog.setButton(DatePickerDialog.BUTTON_NEGATIVE, "취소", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        ((MenuActivity)getActivity()).doSetDate(getTag(), "");
    }
});
// 키리스너를 달아서 취소버튼에 해당하는 KEYCODE값으로 취소버튼이벤트를 감지하여 해결
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.KEYCODE_BACK) {
            ((MenuActivity)getActivity()).doSetDate(getTag(), "");
        }
        return false;
    }
});

이제 하나만 남았습니다. OutSide를 클릭하였을 때 이를 검출하여 이벤트를 실행하는 것!!!! 조만간 해당 내용을 포함하여 다시 포스팅하겠습니다.
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);
        }
    };
}

출처 : http://dante2k.tistory.com/412
Posted by Rcen_J
,

날짜와 시간에 관련된 클래스의 사용법

프로그램을 개발하다고 보면 현재 시간을 알아야 하는 경우가 아주 빈번하게 생길수가 있다.
이런 작업은 JDK에 있는 java.util.Calendar라는 class를 통해서 알아낼 수가 있다. 그런데 이 Calendar라는 class가 추상클래스라서 Calendar 클래스 자체만으로는 현재 시간을 구할 수가 없다.그러면, java.util.Calendar 라는 클래스가 추상클래스로 만들어진 이유는 날짜와 시간을 계산하는 방법이 지역과 문화, 나라에 따라 다르기 때문이다. 그러므로, Calendar 클래스에는 날짜와 시간을 계산하는 일반적인 메소드만 있고, 특정한 날짜와 시간을 계산하는 방법은 서브클래스에서 구현이될 수 있도록 하였다.

예를 들어 양력에 관련되 날짜와 시간을 처리하는 서브클래스로 GregorianCalendar 클래스가 있다.

실제 컴퓨터에 있는 시간에 대해서

컴퓨터에 내장되어 있는 시간은 1970년 1월 1일 00:00:00 GMT(세계표준시) 를 기준으로 현재까지의 경과한 시간을 밀리세컨드로 표현되고 있습니다. 그렇기 때문에 이런 시간값을 사람들이 읽을 수 있는 날짜로 표현하기 위해서는 복잡한 로직이 있는데, 이런 것을 GregorianCalendar 클래스에서 할 수 있다.

GregorianCalendar를 이용하여 현재의 날짜와 시간을 알아내는 방법

파라미터 없는 생성자를 이용하여 GregorianCalendar의 객체를 생성하게 되면 시스템에 있는 현재 시간의 값을 가져올 수 있게 된다.

GregorianCalendar calendar = new GregorianCalendar();

calendar 객체에 있는 정보를 객체 맴버 메서드를 활용하여 다음과 같이 가져올 수 있다.

int year = calendar.get(Calendar.YEAR);          // 연도를 리턴
int month = calendar.get(Calendar.MONTH);    // 월을 리턴
int date = calendar.get(Calendar.DATE);          // 일을 리턴
int amPm = calendar.get(Calendar.AP_PM);    // 오전/오후 구분을 리턴
int hour = calendar.get(Calendar.HOUR);         // 시를 리턴
int min = calendar.get(Calendar.MINUTE);       // 분을 리턴
int sec = calendar.get(Calendar.SECODE);      // 초를 리턴

아래는 현재의 날짜와 시간을 출력하는 프로그램이다.

import java.util.GregorianCalendar;
import java.util.Calendar;

class CalendarExample {
    public satic void main(String[] args) {
        GregorianCalendar calendar = new GregorianCalendar();
        int year = calendar.get(Calendar.YEAR);          
        // 월은 0~11로 리턴되기 때문에 1을 더한다.
        int month = calendar.get(Calendar.MONTH) + 1;    
        int date = calendar.get(Calendar.DATE);          
        int amPm = calendar.get(Calendar.AP_PM);    
        int hour = calendar.get(Calendar.HOUR);         
        int min = calendar.get(Calendar.MINUTE);       
        int sec = calendar.get(Calendar.SECODE);
        String sAmPm = amPm == Calendar.AM ? "오전" : "오후";

        // 연월일 시분초를 주어진 포맷으로 출력
        System.out.printf("%d년 %d월 %d일 %s %d시 %d분 %d초",
           year, month, date, sAmPm, hour, min, sec);
    }

현재 다른 나라의 시간과 시간을 출력

컴퓨터에 있는 시간은 미국에서 만든 컴퓨터든, 독일에서 만든 컴퓨터든 똑같다. GMT 기준 시간으로 시간을 계산하기 때문이다. 하지만, 지금 출력되는 프로그램의 결과는 실제 우리나라의 시간과 같다. 그 이유는 OS에 현재 지역이 우리나라로 설정이 되어 있기 때문이다. 그렇다면 중국의 현재 시간을 알고 싶으면 GregorianCalendar 의 setTimezone 메소드를 활용하면 된다.
calendar.setTimeZone(timeZone); // timeZone은 TimeZone클래스의 객체
timeZone 객체는 TimeZone 클래스의 정적메소드인 getTimeZone을 호출해서 얻는다.

TimeZone timeZone = TimeZone.getTimeZone("Europe/London");

아래는 런던의 현재날짜와 시간을 출력하는 프로그램이다.

import java.util.GregorianCalendar;
import java.util.Calendar;

class CalendarExample {
    public satic void main(String[] args) {
        GregorianCalendar calendar = new GregorianCalendar();

        TimeZone timeZone = TimeZone.getTimeZone("Europe/London");
        calendar.setTimeZone(timeZone);        

        int year = calendar.get(Calendar.YEAR);          
        // 월은 0~11로 리턴되기 때문에 1을 더한다.
        int month = calendar.get(Calendar.MONTH) + 1;    
        int date = calendar.get(Calendar.DATE);          
        int amPm = calendar.get(Calendar.AP_PM);    
        int hour = calendar.get(Calendar.HOUR);         
        int min = calendar.get(Calendar.MINUTE);       
        int sec = calendar.get(Calendar.SECODE);
        String sAmPm = amPm == Calendar.AM ? "오전" : "오후";

        // 연월일 시분초를 주어진 포맷으로 출력
        System.out.printf("%d년 %d월 %d일 %s %d시 %d분 %d초",
           year, month, date, sAmPm, hour, min, sec);
    }
}

참고로 TimeZone 을 얻기위해 입력으로 들어가는 String 들은 다음으로 구할 수 있다.

class TimeZoneIDs {
    public static void main(String[] args) {
        for (String nam : TimeZone.getAvailableIDs())
            System.out.println(name);
    }
}

날짜/시간 객체를 다양하게 표현하는 방법 (DateFormat 클래스와 SimpleDateFormat 클래스)

우선 DateFormat과 SimpleDateFormat 클래스를 활용하게 되면 위의 두 프로그램에서와 같이 많은 코딩을 하지 않아도 된다. 날짜와 시간을 포맷하는 기능을 가진 대표 클래스는 java.text 패키지에 있는 DateFormat 클래스인데, 이 클래스는 추상 클래스이기 때문에 직접 사용할 수 없고, 이 클래스의 서브클래스를 사용한다. SimpleDateFormat 클래스가 해당 서브클래스이다.


yyyy, MM, dd, aa, hh, mm, ss는 의미가 있는 문자들이다. yyyy는 연도를 4자리로 표시하라는 의미이고, MM, dd, aa, mm, ss는 각각 해당 값들을 2자리로 표시하라는 의미이다. 이런 문자를 패턴문자라고 한다. SimpleDateFormat 클래스의 API문서를 확인하면 더 많은 패턴 문자를 확인할 수 있다.

GregorianCalendar 객체를 활용하여 SimpleDateFormat으로 포맷팅한 방법은 다음과 같다.

GregorianCalendar calendar = new GregorianCalendar();
Date date = calendar.getTime();

 // date는 날짜와 시간정보를 담고 있는 객체
String str = dateFormat.format(date);

실제 동작하는 프로그램은 다음과 같다.

class DateFormatTest1 {
    public static void main(String[] args) {
        GregorianCalendar calendar = new GregorianCalendar();
     SimpleDateFormat dateFormat = 
        new SimpleDateFormat("yyyy년 MM월 dd일 aa hh시mm분ss초");
     String str = dateFormat.format(calendar.getTime());
     System.out.println(str);
    }
}

다른 지역의 날짜와 시간을 표시하는 프로그램


class DateFormatTest1 {
    public static void main(String[] args) {
        GregorianCalendar calendar = new GregorianCalendar();
     SimpleDateFormat dateFormat = 
             new SimpleDateFormat("yyyy년 MM월 dd일 aa hh시mm분ss초");
     // 뉴욕에 해당하는 TimeZone객체를 직접 생성 바로 전달
    dateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
     String str = dateFormat.format(calendar.getTime());
     System.out.println(str);
    }
}

 

출처 :  http://myroid.blogspot.kr/2011/10/blog-post_2067.html

Posted by Rcen_J
,