2013년 1월 2일 수요일

[jQuery] 이미지 로드 실패시 대체이미지

$(document).ready(function() {
 // 이미지 로드 실패시 대체 이미지 표시
   $('img').error(function() {
     $J(this).attr('src', '대체이미지경로');
   }).each(function(n) {
     $J(this).attr('src', $J(this).attr('src'));
  });
});

2012년 8월 8일 수요일

[Android] string.xml사용 국가별 언어설정

각 나라마다 해당 언어를 표시 하는 경우가 생겼다.

project의 res 폴더 하위의 values 의 string.xml을 이용해서 간단히 사용할수 있다.

기본적으로 프로젝트 개발시에 values의 string.xml에 정의된 값을 사용하게 되는데,

각 언어별로 폴더를 따로 구성하게 되면, 디바이스에 설정된 시스템언어에 따라 자동으로

각 언어별로 지정된 values 폴더를 참조해서 표현하게 된다. (아래 첨부 이미지 참고)



만일 사용자가 설정한 국가의 언어 폴더가 없을 경우에는 values를 참조한다.

그러니 기본적으로 표현할 언어를 values폴더에 지정하고 사용하면 된다.

values뒤의 폴더명이 en, ja 가 붙는 이유는 시스템에서 나라를 구분하는데 있어 사용하는

구분자 이다.

'en'은 영어, 'ja'는 일본어, 한국어는 'ko'가 된다.

다른 나라는 Android Developer 사이트의 Reference에서  Locale 클레스를 참고 하면 된다.

[http://developer.android.com/reference/java/util/Locale.html]


string.xml 파일을 참고하자면, (나는 한국어 폴더를 따로 만들지 않고 디폴트로 설정했다.)

[values폴더의 string.xml]

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">안녕!!</string>
    <string name="app_name">언어설정 테스트</string>
</resources>


[values-ja폴더의 string.xml]

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">おはよう!</string>
    <string name="app_name">言語設定テスト</string>
</resources>


위와 같이 구성해 놓으면 디바이스가 자동으로 설정 되있는 국가별로 폴더를 찾아서 해당 언어를 뿌려 준다는 사실!!

2012년 5월 15일 화요일

[android] WebView 안의 스크롤 (iscroll)

작업중 리소스로 만들어 놓은 html파일을 webview에서 로드를 해서 보여 주고 있었는데

웹페이지에서 구성한 스크롤이 먹통인것인다.

하루 꼬박 이리저리 서칭한 결과 모바일웹에서는 일부 css 속성을 지원하지 않는다는... ㅠㅠ

그중 하나가 overflow의 scroll 이였던 거다.

아이폰 같은 경우는 iOS5부터는 이 속성이 지원되는데 이유야 어쨌든 나는 안드로이드에서도 문제없이 뷰를 해야 한다는 사실..

역시 존경해 마지 않는 기술자들.. 방법이 없는건 아니다.

나에게 구세주 같았던 사이트를 참조 했다

참고사이트 :

http://codefactory.kr/2011/08/15/iscroll-mobileweb-inner-scroll-area/

http://cubiq.org/iscroll-4


샘플코드를 보면 아주 간단하게 iscroll를 사용해서 뷰를 하고 있고,

 iscroll.js 파일을 잘 활용하면 스크롤 영역 예처리랄지 자신에게 필요하게 수정해서 사용해도 될듯하다.

2012년 5월 3일 목요일

[java] 실수에서 정수로 변환

간단하게 실수를 정수로변환하는 메소드를 만들었다.

소수점 자리수를 지정하여 해당 수의 내림, 반올림, 올림 처리를 해주도록 했다.


/**
* 실수 -> 정수 변환시 자릿수 처리

* @param decimal     부동소수
* @param loc         자릿수 제한 위치. 2자리까지 보이면 2 , 3자리까지면 3 이런식으로 지정
* @param mode        1 내림 , 2 반올림 , 3 올림
* @return 변환 후 정수
*/
public static int decimalCalc(float decimal , int loc , int mode) {

BigDecimal bd = new BigDecimal(decimal);
BigDecimal result = null;

if(mode == 1) {
result = bd.setScale(loc, BigDecimal.ROUND_DOWN); //내림
} else if(mode == 2) {
result = bd.setScale(loc, BigDecimal.ROUND_HALF_UP); //반올림
} else if(mode == 3) {
result = bd.setScale(loc, BigDecimal.ROUND_UP); //올림
}

return result.intValue();
}

2012년 5월 2일 수요일

[android] 3G/WIFI 체크하기

사용하는 디바이스가 현재 3G를 이용하는지, WIFI를 이용중이지를 체크할일이 있다.

각종 어플에서 이에 관련한 경고다이얼로그를 띄워주는걸 본적이 있을테니!

간단하게 context를 인자로 받아서 해당 체크를 true/false로 리턴하는 메소드를 만들었다.

(본인은 해당 메소드를 activity를 상속받은 클래스가 아닌 여기저기서 사용할수 있게 그냥 클래스에 메소드를 만들어 놨기에 Context를 인자로 받게 작성했다. 작성하고자 하는 클래스에 맞에 알아서들 편집해서 쓰시길..)


/**
 * 3G 사용여부 체크
 */
public static boolean is3gNetwork(Context context) {

ConnectivityManager manager =
                     (ConnectivityManager)context.getSystemService(
                                                                  Context.CONNECTIVITY_SERVICE);

// 3G 를 사용하는지 확인힌다.
boolean is3g =
                     manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
                                  .isConnectedOrConnecting();

return is3g;
}


/**
 * Wifi 사용여부 체크
 */
public static boolean isWifiNetwork(Context context) {


 ConnectivityManager manager =
                     (ConnectivityManager)context.getSystemService(
                                                                  Context.CONNECTIVITY_SERVICE);

// Wifi 를 사용하는지 확인힌다.
boolean isWifi =
                     manager.getNetworkInfo(ConnectivityManager. TYPE_WIFI)
                                  .isConnectedOrConnecting();

return  isWifi;
}

[java] 숫자 판별 (전화번호)


프로젝트중에 랜덤으로 받는 데이터들을 webview로 만든 화면에 보여주는 중에
전화번호인 녀석들은 선택했을때 발신 처리를 해야 했다.
삼성에서 만든 갠역시류의 디바이스는 요처리를 자동으로 해주는 통에 신경안쓰고 있었다가,
다른 아이들이 무반응이길래 후다닥... (근데 저 녀석들은 모든 숫자에 다 발신처리를 해준다.
발신할수 없는 숫자 길이여도;)

뭐 안드로이드 웹뷰에서 발신 처리 하는거야 해당 문자를 <a> 태그를 이용해서
지정 url에 tel:전화번호 라고 쓰고 해당 웹뷰의 WebViewClient 에서 shouldOverrideUrlLoading를 오버라이드 해서 받은 url을 발신처리해주면 그만이다.
예) <a href="tel:010*******">010********</a> 뭐 이런 형태!

그런데 요녀석이 전화번호인지 아닌지를 판별하기 위해서 간단한 메소드를 만들었다.
본인은 8자리 미만의 숫자는 발신처리 하지 않도록 하기 위해서 해당 분기문을 넣었지만,
숫자 판별만 필요한 사람이라면 이 분기문을 빼고 사용하면 된다.

     /**
      * 전화번호 판별
      *  : 0~9이외의 문자일 경우 false 반환
      *  : 자리수가 8자리 미만의경우 false 반환
      */
     public boolean isTelNumber(String number) {
         boolean numFlag = true;
         // 널체크
         if (isEmpty(number))
             return false;

         int size = number.length();
         // 자리수 판별
         if (size < 8) {
             numFlag = false;
         } else {
             // 숫자 판별 : 0~9 이외의 문자는 false
             for (int i=0 ; i<size ; ++i) {
                 if (!(48 <= (int)number.charAt(i) && 57 >= (int)number.charAt(i))) {
                     numFlag = false;
                     break;
                 }
         }
       
         return numFlag;
     }


위에서 사용한 isEmpty 메소드도 널체크를 위해 내가 만들어 놓은 녀석
심플하니 여기저기 많이 불리고 있다규!!
    /**
     * 공문자 체크
     */
    public static boolean isEmpty(String str) {
        return (str == null || str.equals("")) ? true : false;
    }

[java] 현재 날짜/시간 정보 취득

현재시간 정보를 가지고 파일명을 만들어야 해서 static 메소드로 만들어 놨다.

리턴 받고싶은 타입을 인자로 넘겨주면 땡~~

개인적으론 두번째 메소드 사용을 권고한다!! ^___^ 으훗~
첫번째 아이는 그냥 Calendar 클래스를 써보고 싶었을뿐 +_+


     /**
      * 현재시간 yyyyMMddHHmmss 타입으로 변환
      */
     public static String currentDatetimeString() {
         Calendar cal = Calendar.getInstance();
       
         StringBuffer buf = new StringBuffer();
         buf.append(String.format("%04d%02d%02d"
                         , cal.get(Calendar.YEAR)
                         , cal.get(Calendar.MONTH) + 1
                         , cal.get(Calendar.DAY_OF_MONTH)));
         buf.append(String.format("%02d%02d%02d"
                         , cal.get(Calendar.HOUR_OF_DAY)
                         , cal.get(Calendar.MINUTE)
                         , cal.get(Calendar.SECOND)));

         return buf.toString();
     }

     /**
      * 현재시간 받은타입으로 변환
      *  - yyyyMMdd
      *  - yy/MM/dd
      *  - yyyyMMddHHmmss
      */
     public static String currentSimpleDateFormat(String formatStr) {
         SimpleDateFormat format = new SimpleDateFormat(formatStr);
         return format.format(new Date());
     }

예를 들면 오늘 날짜 2012년5월3일 데이터로 뽑고 싶다면
currentSimpleDateFormat("yyyy년M월d일") 라고 호출하면 된다.

참고)
     년도 : yyyy, yy
     월    : MM, M
     일    : dd, d
     시    : HH
     분    : mm
     초    : ss