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

[android] 위도,경도 ↔ 주소 취득

1. 위도, 경도로 주소 취득 (Geocoder 이용)

Location 와 LocationManager클래스를 이용해서 위도 경도 정보를 가지고 오자!
location 클래스의 getLatitude(), getLongitude() 메소드 사용
(여기서는 생략!)

취득한 위도,경도값을 가지고 주소를 리턴하는 메소드를 만들었다.

    /**
     * 위도,경도로 주소취득
     * @param lat
     * @param lng
     * @return 주소
     */
    private String findAddress(double lat, double lng) {                                            
        StringBuffer bf = new StringBuffer();
        Geocoder geocoder = new Geocoder(this, Locale.KOREA);
        List<Address> address;
        try {
          if (geocoder != null) {
                // 세번째 인수는 최대결과값인데 하나만 리턴받도록 설정했다
                address = geocoder.getFromLocation(lat, lng, 1);
                // 설정한 데이터로 주소가 리턴된 데이터가 있으면
               if (address != null && address.size() > 0) {
                    // 주소
                    currentLocationAddress = address.get(0).getAddressLine(0).toString();
                   
                    // 전송할 주소 데이터 (위도/경도 포함 편집)
                    bf.append(currentLocationAddress).append("#");
                    bf.append(lat).append("#");
                    bf.append(lng);
                }
            }
           
        } catch (IOException e) {
           Toast.makeText(baseContext, "주소취득 실패"
                 , Toast.LENGTH_LONG).show();

            e.printStackTrace();
        }
        return bf.toString();
    }
===============================================================================

2. 주소로 위도, 경도 취득 (Geocoder 이용)

    /**
     * 주소로부터 위치정보 취득
     * @param address 주소
     */
    private GeoPoint findGeoPoint(String address) {
        Geocoder geocoder = new Geocoder(this);
        Address addr;
        GeoPoint location = null;
        try {
            List<Address> listAddress = geocoder.getFromLocationName(address, 1);
            if (listAddress.size() > 0) { // 주소값이 존재 하면
                addr = listAddress.get(0); // Address형태로
                int lat = (int) (addr.getLatitude() * 1E6);
                int lng = (int) (addr.getLongitude() * 1E6);
                location = new GeoPoint(lat, lng);
               
                Log.d(TAG, "주소로부터 취득한 위도 : " + lat + ", 경도 : " + lng);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return location;
    }


簡単だろ~ ^0^