[안드로이드] 앱 런칭 후 DB TABLE 주의 점.


  이미 앱이 배포가 된 후 TABLE를 생성하고 난 후는 SQLiteOpenHelper 상속받은 Class에서 DB버전 업 onUpgrade에 CREATE TABLE IF NOT EXISTS 블라블라테이블명 를 넣어서 해결 해주면 된다. 한번 생성되면 다시 생성 되진 않을테니 말이다. 하지만 컬럼을 추가 할 경우는 IF NOT EXISTS같은 문구가 없으니 버전별 변경 점을 onUpgrade에 기술 해줘야 한다. CASE문을 쓰면 쉽게 사용자의 버전별 상태에 따라 적용이 가능 한다. 좋은 예제가 있어 아래와 같이 링크 한다. 요는 CASE의 BREAK를 적절히 빼서 사용하면 된다.


1. 예제예제

   - 예제예제 : http://gyjmobile.tistory.com/35

[안드로이드] SupportLibrary 사용과 테마 종류.


   안드로이드 개발하다보면 테마종류와 서포트라이브러리를 어떻게 적용 할 것인가에 대해서 생각 하게 된다. 예제를 보고 기본적인 부분은 익혀 두자.


1. 서포트라이브러리 관련

   - EditText 및 네비게이션 드로우 관련

   - 서포트라이브러를 이용한 EditText 사용


2. 테마 관련

   - 각 테마 확인

   - 앱바(App Bar) 관련

[안드로이드] Canvas를 사용하여 레이아웃 그리기 및 좌표 구하기


   안드로이드 초기에 레이아웃을 로드한 후 그 레이아웃 위에 선이나 원 등을 그릴 경우 View를 확장한 클래스를 이용하여 처리 하면 된다. 아래 예제를 참고 하자!


1. Canvas를 이용 및 좌표 구하기

   - 예제 01

   - 좌표예제 01

   - 좌표예제 02

   - 좌표예제 03


[안드로이드] 2.X.X버전 인스톨 Failure [INSTALL_FAILED_DEXOPT] 에러


   안드로이드 스튜디오에서 빌드 후 인스톨 시 2.x.x 버전대에서 에러가 발생 하는 경우가 있다. 

Failure [INSTALL_FAILED_DEXOPT] 라고 뜨는데 사실 이 원인은 여러가지가 있다.( 구글링 해보시면 나와유 ) 2.x.x에서의 문제는'com.google.android.gms:play-services:5+' 로 지정해줘야 한다. 6이상으로 지정하면 발생 하는 에러이다. 

[안드로이드] 서포트 라이브러리의 이해.


출처 : http://www.kmshack.kr/2015/06/android-support-library/

Android Support Library

안드로이드 플랫폼의 가장 큰 장점 중 하나는 기기와 수 많은 해상도에 대한 다양성 지원이다. 휴대전화 뿐만아니라 태블릿, 최근들어 시계나 오토등 안드로이드는 모든 용도의 플랫폼으로 사용되고 있다. 숫자적인 측면에서 안드로이드는 가장 성공적인 플랫폼이며 현 지점에서 2만개 이상의 기기들이 안드로이드 플랫폼을 사용하고 있다.

모든 기기를 지원하는 만큼 많은 문제점이 발생될 수 밖에 없다. 가장 큰 문제점은 하위호환성의 문제이다. 모든 기기는 안드로이드 플랫폼의 최상위 버전으로 업데이트 된다는 보장이 없기때문에 몇년전의 안드로이드 버전이나 지금의 최상위 버전에 어떻게 동일한 기능을 작동하느냐가 중요한 문제점이다. 이런 문제점은 개발자로 하여금 가장 피곤하게 하는 문제점으로 지적된다.

 

개발자의 고충을 구글의 안드로이드 팀에서는 하위호환성에 대해 전략적으로 중요하다고 인식했으며 발빠르게 대응하여 라이브러리를 통해 개발자들이 해당 문제점의 해결책을 제시해주었다. 안드로이드 API를 분명히 시간이 지남에 따라 변화할 필요가 있기 때문에 향후, 릴리스된 버전에서 파괴되지 않는 방법을 찾는것은 대단히 어려운 일이다. 이 라이브러리는 안드로이드 팀에 의해 만들어진 가장 중요하고 독특한 디자인중 하나이다.

개발자사이트의 서포트라이브러리 문서를 통해 항상 최신의 라이브러리 정보를 확인 할 수 있다.

 

Android Support Library?
안드로이드 호환성 라이브러리로 2011년에 출시 되었으며, 모든 응용프로그램의 75% 이상 설치되어 가장 널리 사용되는 라이브러리이다. 안드로이드 개발자들은 이러한 사실을 잘 알고 있다. 하지만 이러한 사실은 전체적으로 알고 있는 개발자는 흔하지 않다.

서포트 라이브러리는 단순히 호환성 및 기능으로 분류할 수 있는 라이브러리가 아니다.

각 라이브러리는 minSdkVersion이 프로젝트에 사용하기 위해 식별하는 이름 규칙이 있다. 더 높은 버전은 이전 버전의 기능이 포함되어 있다고 생각하는 것이 자연스러우나 이는 조금 혼란할 수 있다. 예를 들면 V7-AppCompat가 항상 Android API Level 4에 모든 기능이 포함될 수 있다고 생각하지만 이는 부정확하다. 서포트 라이브러리의 버전은 minSdkVersion이므로 최소지원 될수 있는 버전을 나타내는것을 의미한다.

 

Support Library

이전 안드로이드 버전을 사용하고 있는 기기에서 새로운 API를 사용 할수 있도록 도와주는 호환성 라이브러리이며 새로운 안드로이드 버전이 나올때 마다 업데이트 된다. 주요 호환성 라이브러리로는 V4및 V7-AppCompat이 있다.

V4
안드로이드 API4부터 사용이 가능한 라이브러리로 API 11에서 소개된 Fragment와 Loader등 주요 클래스의 구현을 지원하며 ViewPager, DrawerLayout등 포함 되어 있다.

V7-AppCompat
V4를 이용하여 확장한 라이브러리로 단순히 액션바(API 11), 툴바(API 21)등을 지원한다.

이러한 서포트 라이브러리는 기본 SDK에서 제공하는 것과 대부분 동일하나 약간의 차이나 기능 축소가 있을 수 있다. 또한 기본 SDK와 라이브러리는 완전히 다르게 분리 시켰기 때문에 사용시 일관성이 떨어 질 수 있다. 예를 들어 기본 SDK에서는 Fragment가 Activity 클래스에서 지원되나 서포트 라이브러리에서 Fragment를 사용하기위해 FragmentSupport라이브러리를 사용해야만 한다. 이러한 일관성의 문제점을 해결 하기위해 구글에서도 상당한 노력을 하고 있다. 예를 들어 안드로이드 스튜디오의 새로운 프로젝트 템플릿을 보면 V7-AppCompat와 V4라이브러리를 기본적으로 포함시켜 개발자로 하여금 의존할 수 있도록 노력하고있다. 즉, 서포트 라이브러리가 필요 하지 않는 경우라도 일반적으로 사용하기를 구글에서는 권하고 있다.

 

기능의 라이브러리

호환성 라이브러리 뿐만 아니라 SDK의 일부가 아닌 기능을 추가하기위한 라이브러리다 이 자체에 포함된 라이브러리는 SDK에 대한 의존성이 전혀 걱정 없이 프로젝트에 추가/삭제 될 수 있다.

V7-recyclerview: 효율적으로 표시하고 대량의 데이터와 애니메이션을 제공하는 ListView를 대체하기위해 설계된 View
V7-cardview: 카드 UI 디자인 패턴의 View
V7-GridLayout: 사각형 격자로 UI를 구성할 수 있는 Layout
V7-mediarouter: 구글 카스트 지원을 위한 MediaRouter
V7-palette: 이미지의 색상 추출

 

디자인 라이브러리

롤리팝 발표시 머트리얼 디자인 가이드 라인이 발표 되었으며 2015년 Google I/O를 통해 가이드라인의 디자인을 실제 구현할 수 있게 도와주는 라이브러리이다. 여기에는 FloatingActionButton, NavigationView, CoordinatorLayout등 다양항 View들이 있다.

 

기타 라이브러리

안드로이드 서포트 라이브러리중 좀 자주 사용하지는 않지만 그래도 사용할만한 몇몇 가지 라이브러리가 있다.
V8: RenderScript(API 11)제공
V13: Fragment UI에 대한 추가적인 지원
V17: TV UI에 대한 지원
multidex: 다중 dex파일에 대한 지원
annotations: @NonNull, @IntDef등 주석에 대한 지원

 

http://developer.android.com/tools/support-library/features.html


[JAVA] JAVA에서 날짜 및 시간 관련 종합


시스템의 밀리초 구하기.(국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각)
// 밀리초 단위(*1000은 1초), 음수이면 이전 시각
long time = System.currentTimeMillis ( ); 
System.out.println ( time.toString ( ) ); 


현 재 시각을 가져오기.
Date today = new Date (); 
System.out.println ( today );

결과 : Sat Jul 12 16:03:00 GMT+01:00 2000


경 과시간(초) 구하기
long time1 = System.currentTimeMillis (); 
long time2 = System.currentTimeMillis ();
system.out.println ( ( time2 - time1 ) / 1000.0 );


Date 를 Calendar로 맵핑시키기
Date d = new Date ( );
Calendar c = Calendar.getInstance ( );
c.setTime ( d );


날 짜(년/월/일/시/분/초) 구하기
import java.util.*;
import java.text.*;

SimpleDateFormat formatter = new SimpleDateFormat ( "yyyy.MM.dd HH:mm:ss", Locale.KOREA );
Date currentTime = new Date ( );
String dTime = formatter.format ( currentTime );
System.out.println ( dTime );


날 짜(년/월/일/시/분/초) 구하기2
GregorianCalendar today = new GregorianCalendar ( );

int year = today.get ( today.YEAR );
int month = today.get ( today.MONTH ) + 1;
int yoil = today.get ( today.DAY_OF_MONTH ); 

GregorianCalendar gc = new GregorianCalendar ( );

System.out.println ( gc.get ( Calendar.YEAR ) );
System.out.println ( String.valueOf ( gc.get ( Calendar.MONTH ) + 1 ) );
System.out.println ( gc.get ( Calendar.DATE ) );
System.out.println ( gc.get ( DAY_OF_MONTH ) );


날 짜(년/월/일/시/분/초) 구하기3
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.KOREA);
Calendar cal = Calendar.getInstance(Locale.KOREA);
nal = df.format(cal.getTime()); 


- 표준시간대를 지정하고 날짜를 가져오기.
TimeZone jst = TimeZone.getTimeZone ("JST");
Calendar cal = Calendar.getInstance ( jst ); // 주어진 시간대에 맞게 현재 시각으로 초기화된 GregorianCalender 객체를 반환.// 또는 Calendar now = Calendar.getInstance(Locale.KOREA);
System.out.println ( cal.get ( Calendar.YEAR ) + "년 " + ( cal.get ( Calendar.MONTH ) + 1 ) + "월 " + cal.get ( Calendar.DATE ) + "일 " + cal.get ( Calendar.HOUR_OF_DAY ) + "시 " +cal.get ( Calendar.MINUTE ) + "분 " + cal.get ( Calendar.SECOND ) + "초 " );

결과 : 2000년 8월 5일 16시 16분 47초 


영 어로된 날짜를 숫자로 바꾸기
Date myDate = new Date ( "Sun,5 Dec 1999 00:07:21" ); 
System.out.println ( myDate.getYear ( ) + "-" + myDate.getMonth ( ) + "-" + myDate.getDay ( ) ); 


"Sun, 5 Dec 1999 00:07:21"를 "1999-12-05"로 바꾸기
SimpleDateFormat formatter_one = new SimpleDateFormat ( "EEE, dd MMM yyyy hh:mm:ss",Locale.ENGLISH );
SimpleDateFormat formatter_two = new SimpleDateFormat ( "yyyy-MM-dd" );

String inString = "Sun, 5 Dec 1999 00:07:21"; 

ParsePosition pos = new ParsePosition ( 0 );
Date frmTime = formatter_one.parse ( inString, pos );
String outString = formatter_two.format ( frmTime );

System.out.println ( outString );


숫 자 12자리를, 다시 날짜로 변환하기
Date conFromDate = new Date();
long ttl = conFromDate.parse ( "Dec 25, 1997 10:10:10" );
System.out.println ( ttl ); //예 938291839221

Date today = new Date ( ttl );
DateFormat format = DateFormat.getDateInstance ( DateFormat.FULL,Locale.US );
String formatted = format.format ( today );
System.out.println ( formatted );


특 정일로부터 n일 만큼 이동한 날짜 구하기
특 정일의 시간을 long형으로 읽어온다음..
날짜*24*60*60*1000 을 계산하여.
long형에 더해줍니다.
그 리고 나서 Date클래스와 Calender클래스를 이용해서 날짜와 시간을 구하면 됩니다


특 정일에서 일정 기간후의 날짜 구하기2
//iDay 에 입력하신 만큼 빼거나 더한 날짜를 반환 합니다.
import java.util.*;

public String getDate ( int iDay ) 
{
Calendar temp=Calendar.getInstance ( );
StringBuffer sbDate=new StringBuffer ( );

temp.add ( Calendar.DAY_OF_MONTH, iDay );

int nYear = temp.get ( Calendar.YEAR );
int nMonth = temp.get ( Calendar.MONTH ) + 1;
int nDay = temp.get ( Calendar.DAY_OF_MONTH );

sbDate.append ( nYear );
if ( nMonth < 10 ) 
sbDate.append ( "0" );
sbDate.append ( nMonth );
if ( nDay < 10 ) 
sbDate.append ( "0" );
sbDate.append ( nDay );

return sbDate.toString ( );
}


현 재날짜에서 2달전의 날짜를 구하기
Calendar cal = Calendar.getInstance ( );//오늘 날짜를 기준으루..
cal.add ( cal.MONTH, -2 ); //2개월 전....
System.out.println ( cal.get ( cal.YEAR ) );
System.out.println ( cal.get ( cal.MONTH ) + 1 );
System.out.println ( cal.get ( cal.DATE ) );


달 에 마지막 날짜 구하기
for ( int month = 1; month <= 12; month++ ) 
{
GregorianCalendar cld = new GregorianCalendar ( 2001, month - 1, 1 );
System.out.println ( month + "/" + cld.getActualMaximum ( Calendar.DAY_OF_MONTH ) );
}


해 당하는 달의 마지막 일 구하기
GregorianCalendar today = new GregorianCalendar ( );
int maxday = today.getActualMaximum ( ( today.DAY_OF_MONTH ) );
System.out.println ( maxday );

특 정일을 입력받아 해당 월의 마지막 날짜를 구하는 간단한 예제.(달은 -1 해준다.)...윤달 30일 31일 알아오기.
------------------------------------------------------------------
Calendar cal = Calendar.getInstance ( );
cal.set ( Integer.parseInt ( args[0] ), Integer.parseInt ( args [1] ) - 1, Integer.parseInt ( args [2] ) );
SimpleDateFormat dFormat = new SimpleDateFormat ( "yyyy-MM-dd" );
System.out.println ( "입력 날짜 " + dFormat.format ( cal.getTime ( ) ) );
System.out.println ( "해당 월의 마지막 일자 : " + cal.getActualMaximum ( Calendar.DATE ) );
------------------------------------------------------------------

해 당월의 실제 날짜수 구하기 ( 1999년 1월달의 실제 날짜수를 구하기 )

Calendar calendar = Calendar.getInstance ( );
calendar.set ( 1999, 0, 1 );
int maxDays = calendar.getActualMaximum ( Calendar.DAY_OF_MONTH );


어 제 날짜 구하기
오 늘날짜를 초단위로 구해서 하루분을 빼주고 다시
셋팅해주면 쉽게 구할수 있죠..
setTime((기준일부터 오늘까지의 초를 구함) - 24*60*60)해주면 되겠죠..


어 제 날짜 구하기2
import java.util.*;

public static Date getYesterday ( Date today )
{
if ( today == null ) 
throw new IllegalStateException ( "today is null" );
Date yesterday = new Date ( );
yesterday.setTime ( today.getTime ( ) - ( (long) 1000 * 60 * 60 * 24 ) );

return yesterday;
}


내 일 날짜 구하기
Date today = new Date ( );
Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) );


내 일 날짜 구하기2
Calendar today = Calendar.getInstance ( );
today.add ( Calendar.DATE, 1 );
Date tomorrow = today.getTime ( );


오 늘날짜에서 5일 이후 날짜를 구하기
Calendar cCal = Calendar.getInstance();
c.add(Calendar.DATE, 5);


날 짜에 해당하는 요일 구하기
//DAY_OF_WEEK 리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다. 
//아래 소스는 JSP일부입니다.
import java.util.*;

Calendar cal= Calendar.getInstance ( );
int day_of_week = cal.get ( Calendar.DAY_OF_WEEK );
if ( day_of_week == 1 )
m_week="일요일";
else if ( day_of_week == 2 )
m_week="월요일";
else if ( day_of_week == 3 )
m_week="화요일";
else if ( day_of_week == 4 )
m_week=" 수요일";
else if ( day_of_week == 5 )
m_week="목요일";
else if ( day_of_week == 6 )
m_week="금요일";
else if ( day_of_week == 7 )
m_week=" 토요일";
--------------------------------------------------
오늘은 : 입니다.


콤 보박스로 선택된 날짜(예:20001023)를 통해 요일을 영문으로 가져오기
//gc.get(gc.DAY_OF_WEEK); 하면 일요일=1, 월요일=2, ..., 토요일=7이 나오니까, 
//요일을 배열로 만들어서 뽑아내면 되겠죠. 
GregorianCalendar gc=new GregorianCalendar ( 2000, 10 - 1 , 23 ); 
String [] dayOfWeek = { "", "Sun", "Mon", .... , "Sat" }; 
String yo_il = dayOfWeek ( gc.get ( gc.DAY_OF_WEEK ) ); 


두 날짜의 차이를 일수로 구하기
각 각의 날짜를 Date형으로 만들어서 getTime()하면 
long으로 값이 나오거든요(1970년 1월 1일 이후-맞던가?- 1/1000 초 단위로..)
그러면 이값의 차를 구해서요. (1000*60*60*24)로 나누어 보면 되겠죠.


두 날짜의 차이를 일수로 구하기2
import java.io.*;
import java.util.*;

Date today = new Date ( );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( today );// 오늘로 설정. 

Calendar cal2 = Calendar.getInstance ( );
cal2.set ( 2000, 3, 12 ); // 기준일로 설정. month의 경우 해당월수-1을 해줍니다.

int count = 0;
while ( !cal2.after ( cal ) )
{
count++;
cal2.add ( Calendar.DATE, 1 ); // 다음날로 바뀜

System.out.println ( cal2.get ( Calendar.YEAR ) + "년 " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "월 " + cal2.get ( Calendar.DATE ) + "일" );
}

System.out.println ( "기준일로부터 " + count + "일이 지났습니다." );



파 일에서 날짜정보를 가져오기
------------------------------------------------------------------
File f = new File ( directory, file );

Date date = new Date ( f.lastModified ( ) );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( date );

System.out.println("Year : " + cal.get(Calendar.YEAR));
System.out.println("Month : " + (cal.get(Calendar.MONTH) + 1));
System.out.println("Day : " + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("Hours : " + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("Minutes : " + cal.get(Calendar.MINUTE));
System.out.println("Second : " + cal.get(Calendar.SECOND));




쓰 레드에서 날짜 바꾸면 죽는 문제
Main 화면에 날짜와시간이Display되는 JPanel이 있습니다.
date로 날짜와 시간을 변경하면 Main화면의 날짜와 시간이 Display되는 Panel에 
변경된 날짜가 Display되지 않고 Main화면이 종료되어 버립니다.

문제소 스:
public void run ( )
{
while ( true )
{
try{
timer.sleep ( 60000 );
}
catch ( InterruptedException ex ) { }

lblTimeDate.setText ( fGetDateTime ( ) ); 
repaint ( );
}
}

public String fGetDateTime ( )
{
final int millisPerHour = 60 * 60 * 1000;
String DATE_FORMAT = "yyyy / MM / dd HH:mm";
SimpleDateFormat sdf = new SimpleDateFormat ( DATE_FORMAT );
SimpleTimeZone timeZone = new SimpleTimeZone ( 9 * millisPerHour, "KST" );
sdf.setTimeZone ( timeZone );

long time = System.currentTimeMillis ( );
Date date = new Date ( time );
return sdf.format ( date );
}

해답:
// 날짜와 요일 구한다. timezone 으로 날짜를 다시 셋팅하시면 됨니다.
public String getDate ( )
{
Date now = new Date ( );
SimpleDateFormat sdf4 = new SimpleDateFormat ( "yyyy/MM/dd HH:mm EE" );
sdf4.setTimeZone ( TimeZone.getTimeZone ( "Asia/Seoul" ) );

return sdf4.format ( now );
}


날 짜와 시간이 유효한지 검사하려면...?

import java.util.*;
import java.text.*;

public class DateCheck 
{
boolean dateValidity = true;

DateCheck ( String dt )
{ 
try 
{
DateFormat df = DateFormat.getDateInstance ( DateFormat.SHORT );
df.setLenient ( false ); 
Date dt2 = df.parse ( dt ); 
}
catch ( ParseException e ) { this.dateValidity = false; }
catch ( IllegalArgumentException e ) { this.dateValidity = false; }
} 

public boolean datevalid ( )
{ 
return dateValidity;
}

public static void main ( String args [] ) 
{
DateCheck dc = new DateCheck ( "2001-02-28" );
System.out.println ( " 유효한 날짜 : " + dc.datevalid ( ) );
}
}


두 날짜 비교하기(아래보다 정확)
그 냥 날짜 두개를 long(밀리 세컨드)형으로 비교하시면 됩니다...

이전의 데이타가 date형으로 되어 있다면, 이걸 long형으로 변환하고.
현재 날짜(시간)은 System.currentTimeMillis()메소드로 읽어들이고,
두수 (long형)를 연산하여 그 결과 값으로 비교를 하시면 됩니다.

만약 그 결과값이 몇시간 혹은 며칠차이가 있는지를 계산할려면,
결과값을 Calender의 setTimeInMillis(long millis) 메소드를 이용해
설정한다음 각각의 날짜나 시간을 읽어오시면 됩니다


두 날짜 비교하기2
//Calendar 를 쓸 경우 데이타의 원본을 고치기 때문에 clone()을 사용하여 
//복사한 후에 그 복사본을 가지고 비교한다
import java.util.*;
import java.util.Calendar.*;
import java.text.SimpleDateFormat;

public class DayComparisonTest
{
public static void main(String args[])
{
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateForm = new SimpleDateFormat("yyyy-MM-dd");

Calendar aDate = Calendar.getInstance(); // 비교하고자 하는 임의의 날짜
aDate.set(2001, 0, 1);

Calendar bDate = Calendar.getInstance(); // 이것이 시스템의 날짜

// 여기에 시,분,초를 0으로 세팅해야 before, after를 제대로 비교함
aDate.set( Calendar.HOUR_OF_DAY, 0 );
aDate.set( Calendar.MINUTE, 0 );
aDate.set( Calendar.SECOND, 0 );
aDate.set( Calendar.MILLISECOND, 0 );

bDate.set( Calendar.HOUR_OF_DAY, 0 );
bDate.set( Calendar.MINUTE, 0 );
bDate.set( Calendar.SECOND, 0 );
bDate.set( Calendar.MILLISECOND, 0 );


if (aDate.after(bDate)) // aDate가 bDate보다 클 경우 출력
System.out.println("시스템 날짜보다 뒤일 경우 aDate = " + dateForm.format(aDate.getTime())); 
else if (aDate.before(bDate)) // aDate가 bDate보다 작을 경우 출력
System.out.println("시스템 날짜보다 앞일 경우 aDate = " + dateForm.format(aDate.getTime()));
else // aDate = bDate인 경우
System.out.println(" 같은 날이구만");
}
}

Android에서 Setting - Date&time 셋팅창에 24시간 포맷이 되어있는지 12시간 포맷이 되어있는지 알려주는 메서드

public boolean DateFormat.is24HourFormat(content)

ex) boolean h = DateFormat.is24HourFormat(this);
반환값 true : 24시간포맷

          false : 12시간포맷

출처 : http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=46259&page=16

[JAVA] Collection과 Map 등 자료 구조에 대해 알아보자.


출처 : http://withwani.tistory.com/150


포스트 내용의 참고자료 출처 : 소설같은자바 Third Edition

   

JAVA에서 기본적인 자료 구조를 제공하기 위한 환경을 JAVA Collection Framework라고 한다.

다음은 JAVA Collection Framework의 상속 기본 구조이다.

  

   

  1. Collection

    Collection 인터페이스를 상속받아 List와 Set 인터페이스가 된다. List는 순서가 있는 Collection, 그리고 List는 Data 중복을 허락한다. 하지만 Set은 순서의 의미가 없으며 Data를 중복해서 포함할 수 없다.

  • List 인터페이스의 특징
    • 순서가 있는 Collection.(이 순서는 삽입된 순서를 의미한다.)
    • Data를 중복해서 포함할 수 있다.
    • Stack의 특징
      • Data의 삽입과 추출이 후입선출(Last-In First-Out) 구조로 되어 있다.
      • push() method : Data 삽입할 때 사용
      • pop() method : Data 추출할 때 사용
      • peek() method : 추출할 Data를 삭제하지 않고 Data만을 가져 올 때 사용
      • search() method : Stack으로부터 Data를 검색할 때 사용
    • Vector의 특징
      • 자동으로 동기화를 보장해준다.
      • ArrayList에 동기화가 보장되도록 최적화한 클래스이다.
      • JAVA 5.0 이 후로는 AutoBoxing/AutoUnBoxing을 지원한다.
        • AutoBoxing이란? 기본 Data 타입을 Wrapper 클래스형의 객체로 자동으로 변환해주는 기능. AutoUnBoxing은 AutoBoxing의 반대 개념
        • JAVA 1.4까지

Vector v = new Vector();
v.addElement(new Integer(100));

  • JAVA 5.0이후

Vector v = new Vector();
v.addElement(100); // AutoBoxing 발생, 자동으로 Wrapper class인 Integer로 변경

  • addElement() method : Data를 삽입할 때 사용
  • elementAt() method : Data를 추출할 때 사용, Index에 해당하는 객체를 얻어냄
  • size() method : Vector 내에 존재하는 객체의 수를 얻어낼 대 사용
  • insertElementAt() method : Vector 내에 중간 삽입할 때 사용
  • setElementAt() method : Vector 내에 존재하는 Data를 수정할 때 사용
  • indexOf() method : Vector 내에 Data를 검색할 때 사용, Index를 반환
  • contains() method : Data의 존재 유무를 알기 위해 사용.
  • ArrayList의 특징
    • 동기화를 보장해주지 않는다.
    • 배열에 동적 메모리 증가 기능을 구현한 클래스이다.
    • 동기화 지원 방법 : List list = Collections.synchronizeList(new ArrayList(…));
    • add() method : Data 삽입할 때 사용
    • get(0 method : Data 추출할 때 사용
    • toArray() method : ArrayList로부터 배열 얻어낼 때 사용
    • contains() method : Data의 존재 유무를 알기 위해 사용
    • size() method : ArrayList의 요소 개수를 얻어낼 때 사용
  • Set 인터페이스의 특징
    • 집합적인 개념의 Collection
    • 순서의 의미가 없다.
    • Data를 중복해서 포함할 수 없다.
    • HashSet의 특징
      • add() method : Data 삽입할 때 사용
      • next() method : Data 추출할 때 사용
        • HashSet의 Data 추출은 Iterator을 이용하면 된다. Iterator는 Collection내의 모든 Data에 접근할 수 있는 특징이 있다. 그리고 Data의 마지막에 상관하지 않고 검색하기 위한 인터페이스이다. Set의 Iterator() method로 Iterator를 얻어 낼 수 있으며, Iterator의 hasNext() method를 이용해서 Data 끝을 만날 때까지 next() method를 호출해서 Data를 추출할 수 있다.

Iterator<String iter = set.iterator();
while(iter.hasNext()) {
String temp = iter.next();

System.out.print(temp + ", ");
}

  • remove() method : Data를 삭제할 때 사용
  • contains() method : Data의 포함여부를 알기 위해 사용
  • size() method : HashSet의 요소 개수를 얻어낼 때 사용

       

  1. Map

    List와 Set이 순서나 집합적인 개념의 인터페이스라면 Map은 검색의 개념이 가미된 인터페이스이다. Map 인터페이스는 데이터를 삽입할 때 Key와 Value의 형태로 삽입되며, Key를 이용해서 Value를 얻을 수 있다.

  • Hashtable, HashMap의 공통점
    • 내부적으로 모두 Hash 기법을 이용한다.
    • Map 인터페이스를 구현하고 있다.
    • Key와 Value를 이용해서 Data를 관리한다.
  • Hashtable, HashMap의 차이점
    • Hashtable은 동기화가 보장된다.
    • HashMap은 동기화가 보장되지 않는다.
    • HashMap의 동기화 지원 방법 : Map m = Collections.synchronizedMap(New HashMap(…));
  • Hashtable, HashMap과 HashSet과의 관계
    • Hashtable과 HashMap은 둘 다 Map 인터페이스를 구현하고 있다.
    • HashSet은 내부적으로 Hash기법을 사용하지만 Set인터페이스를 구현하고 있다.
  • HashMap
    • 객체 생성 : Map<String, Integer> map = new HashMap<String, Integer>();
    • put() method : Data 삽입할 때 사용
    • get() method : Data를 추출할 때 사용, argument값은 Key를 사용
  • Hashtable
    • 객체 생성 : Hashtable<String, Object> h = new Hashtable<String, Object>();
    • put() method : Data 삽입할 때 사용
    • get() method : Data를 추출할 때 사용, argument값은 Key를 사용

   

  1. Sorted

    Set과 Map 인터페이스를 상속받아 정렬 기능이 추가된 SortedSet과 SortedMap 인터페이스가 된다. 그리고 이들은 각각 TreeSet 클래스와 TreeMap 클래스로 구성된다. TreeSet과 TreeMap은 Set과 Map의 기능을 가지고 있으면서 정렬 기능이 가미되었다는 것이 특징이다.

  • Sorted를 지원하지 않는 클래스
    • HashSet, HashMap
  • Sorted를 지원하는 클래스
    • TreeSet, TreeMap
  • TreeMap
    • Key와 Value로 Data를 관리
    • Key를 기준으로 오름차순으로 정렬된다.
    • Map 인터페이스를 상속한 SortedMap 인터페이스를 구현한 클래스
  • TreeSet
    • Set 인터페이스를 상속한 SortedSet 인터페이스를 구현한 클래스
    • 데이터들이 자동으로 오름차순으로 정렬된다.
  • Comparator
    • TreeSet과 TreeMap은 사용자가 직접 정렬의 방식을 지정할 수 있다.
    • TreeSet과 TreeMap은 정렬을 위한 Comparator 인터페이스를 구현하면 된다.
    • TreeSet에 Data를 집어 넣으면 기본적으로 오름차순(Ascending) 정렬이 되지만 그것도 문자열이나 기본 데이터 타입과 같은 단순한 것에만 해당된다. 이에 사용자가 직접 비교법을 넣어주기 위해 사용하는 것이 Comparator 인터페이스이다.
    • Comparator의 구현 방법 : Comparator 내부에 compare() method를 구현하면 된다.

class Mycomparator<T> implements Comparator<T> {
public int compare(T o1, T o2) {
// 비교방법 구현
}

  • Comparator가 추가된 TreeSet의 생성

TreeSet<Score> tset = new TreeSet<Score>(new MyComparator<Score>());

  • Comparator가 추가된 TreeMap의 생성

TreeMap<Score, String> tset = new TreeMap<Score, String>(new MyComparator<Score>());

  • 일반적인 정렬기능의 사용
    • HashSet이나 HashMap을 정렬 기능이 지원되는 TreeSet이나 TreeMap으로 변환해서 사용
    • HashSet을 이용한 TreeSet 생성

Set<String> set = new HashSet<String>();
...
TreeSet<String> ts = new TreeSet<String>();
ts.addAll(set);

  • HashMap을 이용한 TreeMap 생성

Map<String, Integer> map = new HashMap<String, Integer>();
...
Map<String, Integer> sortedMap = new TreeMap<String, Integer>();
sortedMap.putAll(map);

   

[안드로이드] View에 날짜를 보여줄 경우 포맷 관련






we use make use of Calender class of java.util package , the static method getInstance of Calender class returns the  instance of Calender and this object can produce all the time field values  needed to implement the date-time format

 Calendar c = Calendar.getInstance();

After getting calendar Instance , we required a formatted object for date and time.

The SimpleDateFormat Class is used for setting the format , the constructor of this class takes the pattern describing what strings are to produced

SimpleDateFormat format = new SimpleDateFormat("dd:MMMM:yyyy HH:mm:ss ");
String formatdate=format(c.getTime());


file : activity_main.xml
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/display"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="22sp" />

</RelativeLayout>

file : MainActivity
package com.example.sysdatetime;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

 TextView tv;
 Button btn;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  tv = (TextView) findViewById(R.id.display);

  Calendar c = Calendar.getInstance();

  SimpleDateFormat format1, format2, format3, format4, format5;

  format1 = new SimpleDateFormat("dd:MM:yyyy:HH:mm:ss ");

  format2 = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss");

  format3 = new SimpleDateFormat("dd-MMMM-yyyy-HH-mm-ss");

  format4 = new SimpleDateFormat("dd/MMM/yyyy/HH/mm/ss");

  format5 = new SimpleDateFormat("dd_MM_yy_HH_mm_ss a");

  tv.setText(format1.format(c.getTime()) + "\n\n"
    + format2.format(c.getTime()) + "\n\n"
    + format3.format(c.getTime()) + "\n\n"
    + format4.format(c.getTime()) + "\n\n"
    + format5.format(c.getTime()));

 }
}


In this below table you can see the patterns description for date time and also the separator which is used for formatting.

Date format 

Date FormatDescriptionValue
dSingle digit date eg 11
dddouble digit date eg 0101
MSingle digit month eg: 11
MMDouble digit month eg: 0101
MMMthree letter abbreviation for month ex: janjan
MMMMmonth spelled out in full ex : januaryjanuary
yydouble digit year ex : 1414
yyyyfour digit year ex : 20142014



Time Format 

Time FormatDescriptionValue
hsingle digit hours in 12hours format9
hhdouble digit hours in 12 hour format09
Hsingle digit hours in 24 hour format8AM as 8
8PM as 20
HHdouble digit hours in 24 hour format8AM as 08
8PM as 20
msingle digit minute9
mmdouble digit minute09
ssingle digit second9
ssdouble digit second09
aMarkeram/pm



Separator 

FormatDescription
" . "Dots or full stops
" _ "Hyphens or dashes
" "Spaces
" : "colon mostly used between time
" / "Slash


[안드로이드] 구글 머터리얼 디자인(Material Design) 관련


    구글이 머터리얼 디자인이란 디자인 가이드라인을 제시 함으로서 앱의 동작 방법이나 화면이 어느정도 일관성이 갖게 된거 같다. 아직 하위 버전에 대한 지원이 완벽하진 않은거 같지만... 뭐 앞으로 만들어지는 앱들은 이런 디자인으로 가지 않을까 싶은 생각이다. 구글의 가이드라인을 보면 저런것들을 어떻게 코드로 구현해야 하지 의문점이 많이 든다. 분명 가능하니 가이드라인을 제시 했을테니 말이다. 남의 앱을 보거나 예제를 보면 한층 빠르게 배울 수 있으므로 관련 사이트들을 링크 해놓고자 한다. 물론 미래의 나를 위해서... 또 이글을 보는 사람들에게 도움이 되기 위해... 라이브러리를 가져다 쓰는것도 빠른 개발 방법이지만 응용력을 기르기 위해선 이해도 중요하니.. 본인도 이해를 위해 노력하며 작업 해 볼까 한다. 여러분도 그러하길!! 


1. 링크! 링크! 링크!! 

  - 머터리얼 디자인 구글 공식 가이드 사이트

  - 달력 관련 디자인 01

  - 달력 관련 디자인 02

  - Expand and collapse animation 예제

  - Floating Action Bar(FAB) 관련 01

  - FAB 관련 02

  - FAB 관련 03

  - ObservableScrollView(스크룰시 액션바와 FAB 등의 연계 예제)

  - 스크룰시 애니메이션 관련

  - MATERIAL DESIGN, EXTENDED TOOLBAR AND SCROLLING 예제

  - How to hide/show Toolbar when list is scroling 예제

  - 머터리얼 관련 위젯의 사용 예제 모음

  - 머터리얼 관련 위젯의 사용 예제 모음 02( 굳굳! )

  - 머터리얼 디자인 관련 예제 모음( 굳굳!! )

  


[안드로이드] 어플의 홈 위젯을 만들어 보자.


   안드로이드 개발을 하다보면 홈 화면의 위젯을 만들어야 할 경우가 있다. 사실 네이버쪽은 관련 자료가 많지는 않은거 같고... 역시 레퍼런스는 안드로이드 개발자 센터쪽을 이용 하거나 구글 검색으로 검색 해보는게 좋겠다. 이전에도 LOL 배심원단 앱을 만들면서 작업을 해 보았지만 오래된 나머지 다 잊어서 다시 찾아보면서 만들고 있다. 다른 분들과 저를 위해 링크를 남겨 봅니다. 어차피 또 잊어먹고 찾을 시기가 올 테니.. !!


1. 남에게 전수 할 수준이 아니니 오직 링크!!

  - Homescreen App Widgets Example in Android

  - Android App widget을 만들어 보자

  - 위젯의 TextView BackgroundColor 바꾸기

  - 인텐트를 이용한 클릭 이벤트 주는 방법

  - 인텐트를 이용한 클릭 이벤트 주는 방법 02

  - 공식 개발자 가이드 사이트를 보자보자보자




[안드로이드] APK 배포시 Database 넘겨주기.


   사용자가 APK를 다운로드 할 경우 기초데이터 DB를 세팅해야 할 경우가 있을 것이다. 대체적으로 작은 데이터라면 앱이 실행 됨과 동시에 테이블을 생성하고 INSERT문으로 데이터를 넣어주면 될 것이다. 하지만 데이터가 많다면 어떻게 해야 할까. ASSETS에 DB를 만들어 놓고 앱에서 사용하는 방법이 있을 것이고, 앱이 시자 됨과 동시에 서버와의 통신을 통하여 동기화 하는 방법이 있을 것이다. 두가지 어떤것이든 편한 방법으로 만들면 기능상의 문제는 없으리라 생각이 된다. ASSETS의 경우는 앱이 시작됨과 동시에 안드로이드폰 내부로 DB를 복사해줘야 하는 것을 잊지 말아야 한다. 자세한 것은 아래 링크들을 참고하여 만들면 되겠다. 아래 내용은 모두 ASSETS를 이용과 관련된 내용이다.


1. 링크 링크 링크!!!!

  - http://blog.naver.com/iamhyeongkyu/110090943249

  - SQLITE CSV파일 IMPORT 하기

  - SQLITE CSV파일 IMPORT 하기 02

  - ASSETS의 DB 복사 후 사용 방법

  - 마지막으로 SQLITE DB만들 때는 SQLITEBROWSER을 사용하면 편하다.

[안드로이드] 안드로이드 레이아웃(액션바, 런처아이콘)등 만들어보자.


   안드로이드의 액션바와 런처아이콘을 만드려고 할 때 좀 난해 한 경우가 많다. 아래 사이트에 가보면 약간의 도움이 될 수 있는 부분들이 있다. 참고 하자. 기본 스타일을 정하고 아래의 사이트를 이용하여 완성해 나가면 어느정도 괜찮은 레이아웃과 아이콘이 나오는거 같다.


1. 링크링크 사이트!

  - 아이콘 만들기

  - 액션바 스타일 만들기

  - 간단하게 나인패치 만들기

  - 모음 사이트

[안드로이드] ExpandableListView에 대해 알아 보자


   리스트뷰랑 같다고 보면 된다. 단지 리스트뷰의 각 로우에 또 다른 리스트뷰가 하나 더 존재 한다고 생각하면 된다. 리스트뷰의 로우를 클릭 하면 새로운 리스트가 나오면서 작업을 할 수 있는 환경을 만들 수 있겠다. 네이버나 구글에 ExpandableListView라고 치면 많은 예제가 나오니 참고 하기 바라며 저 또한 한 링크 위주로 포스팅을 해두겠습니다.


1. 백문이 불여일타이핑!?

  - 예제1 : 예제를 보고 따라 만들자!

  - 예제2 : 예제를 보고 따라 만들자!

  - 모두 펼치려면!?

  - 부모그룹의 로우 별 다른 레이아웃을 적용 하려면?!

  - 부모리스트의 인디케이터 관련1

  - 부모리스트의 인디케이터를 오른쪽으로 옮기자

  - 좋은 라이브러리가 많다1

  - 좋은 라이브러리가 많다2

  - 좋은 라이브러리가 많다3


[안드로이드] 죽지 않는 서비스(Service) 관련


   사실 강력한 테스크 킬러 앞에서 죽지 않는 서비스나 forground 노티피케이션은 없는거 같다. 나의 베가 LTE의 테스크 킬러 또한 그러하다 너무나 강력하다. 그렇다고 하더라도 기본적으로 죽지 않도록 구성은 해놔야 할 것 아닌가?! 관련 내용을 정리 해 둔다.


1. 링크로 확인하자.

  - http://blog.naver.com/dlsdnd345/220256012140

  - http://ccdev.tistory.com/22

[안드로이드] 네비게이션 드로우의 아이콘 변화 관련


   지금 구글 플레이를 가보면 왼쪽 상단 아이콘이 리스트 아이콘으로 되어 있고 누르면 형태가 변하면서 왼쪽에서 네비게이션 리스트뷰가 나타나게 되어 있다. 이 부분이 무척 궁금하여 조금 찾아보고 포스팅을 남겨 둔다.


1. 관련 링크를 참조하자

  - https://developer.android.com/training/implementing-navigation/nav-drawer.html

  - http://androidhuman.tistory.com/559

  - http://chrisrenke.com/drawerarrowdrawable/