2012.08.07 08:57

* DIP 값으로 Pixel 값 얻기

 private static float displayDensity = -1f;

  private static final float DEFAULT_HDIP_DENSITY_SCALE = 1.5f;


  public int getPixelByDIP(int dip)

  {

  if(displayDensity==-1f)

  displayDensity = this.getResources().getDisplayMetrics().density;


  return (int)(dip / displayDensity * DEFAULT_HDIP_DENSITY_SCALE+0.5);

  }



신고
Posted by 그린블로그 DEV그린
2012.08.03 10:09

크롬브라우저나 인터넷 익스플로러에서 당연히 쓰이던 width=100%가 안드로이드 WebView에서는 먹히지 않습니다.


해결책은 의외로 간단합니다.


 <img src="yourImage.png" width='100%25' />


원인은 %를 제대로 인식하지 못해서 에러가 나는거였는데요.


%는 %25로 해야 제대로된 문자열 '%'로 인식합니다.


http://www.hypergurl.com/urlencode.html 


이곳에 가면 자동으로 encode, decode 해주는 프로그램이 있습니다.



아까 언급한 사이트로 접속 후 변환하고자 하는 문자열을 쓰고 밑의 Encode버튼을 누르면 자동으로 인코딩 되어 'URL encoded text에 나타납니다.



신고
Posted by 그린블로그 DEV그린
2012.08.02 17:27

안드로이드에서는 txt.contains("") 하나면 쉽게 해결 될 것을 아이폰에서는 드릅게 꼬아놨습니다.

하지만 익숙해지면 괜찮다는거~ 다음을 봐주세요.


* userText가 String 값 "문자열"을 포함하고 있으면 //TODO 부분의 소스를 실행한다.

 if(!([userText rangeOfString:@"문자열"].location == NSNotFound)){

 //TODO

 NSLog(@"문자열이 포함됨");

 }



신고
Posted by 그린블로그 DEV그린
2012.08.01 17:15

* 폰인지 태블릿인지 판별하는 메소드

 static boolean isTablet (Context context) { 

        // TODO: This hacky stuff goes away when we allow users to target devices 

        int xlargeBit = 4; // Configuration.SCREENLAYOUT_SIZE_XLARGE;  // upgrade to HC SDK to get this 

        Configuration config = context.getResources().getConfiguration(); 

        return (config.screenLayout & xlargeBit) == xlargeBit; 

    } 


* 실제 사용

  if(isTablet(this)){

   //TODO 태블릿일 때 적용할 소스

  }



신고
Posted by 그린블로그 DEV그린
2012.07.26 09:00

AsyncTask의 doInBackground에서 통신중에 try catch의 catch에 Toast를 쓰지 말 것.


에러가 난다.


그러므로 catch에서는 전역으로 선언해둔 boolean 값을 false로 먹여놓고 


catch로 넘어올 때 true로 바꾼 다음 


onPostExecute에서 비로소 띄워주는 것이 좋다.


다이얼로그도 마찬가지.


doInBackground에서 조건에 맞춰 다이얼로그를 뜨게 한다음 return을 먹였으나 작동하지 않았다 


그래서 다이얼로그도 같은 방식으로 onPostExecute로 옮긴 결과 제대로 실행이 되었다.


신고
Posted by 그린블로그 DEV그린
2012.07.20 14:37

html을 String에 담아 webview에서 load할 수도 있습니다~

 WebView mWebView = (WebView) findViewById(R.id.webview);


 String summary = "<meta http-equiv='Content-Type' content='text/html; charset=utf-16le'>" +

            "<html>" +

            "<body>" +

    "<img src='http://cfile1.uf.tistory.com/image/1353844D4FE2DDE6049EB7'>" +

            "</body>" +

            "</html>";

 mWebView.loadDataWithBaseURL("a", summary, "text/html", "UTF-8", null);


✭ 주의사항 : 

일부 디바이스에서는 .loadUrl이 제대로 먹지 않는 경우가 많습니다. 

그러므로 항상 .loadDataWithBaseURL을 이용해주세요~


신고
Posted by 그린블로그 DEV그린
2012.07.19 14:55

if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){

        NSLog(@"Device info : iPhone");

    } else {

        NSLog(@"Device info : iPad");

    }




이 소스를 넣기 전에 프로젝트 - Target에서 Devices로 되어있는 콤보박스의 값을 Universal로 변경해주어야 한다.

신고
Posted by 그린블로그 DEV그린
2012.07.19 11:23

안드로이드에선 문자열 연결이 +로 모든게 해결되었던 것과 달리 아이폰에선 좀 더 '귀찮게' 변합니다. 


그래서 자바나 안드로이드를 접하다 아이폰을 접하게 되면 기본적인 것부터 헷갈리게 되는데요.


가장 기본적인 문자열 합치기를 알아보겠습니다.



NSString * str = [NSString stringWithFormat:@"%@|%@|%@", @"문자열1번"@"문자열2"@"문자열3"];


NSLog(@"str : %@", str);


로그를 출력해보면 결과 값은 '문자열1번|문자열2번|문자열3번' 으로 출력되는 것을 확인할 수 있습니다.


중간에 보면 |는 구분자로 넣어놨지만 |가 포함된 곳에는 아무 문자열이나 넣어도 상관없습니다.

신고
Posted by 그린블로그 DEV그린
2012.07.19 11:18

int timestamp = [[NSDate date] timeIntervalSince1970];

                    

NSString *strTimestamp= [NSString stringWithFormat:@"%d", timestamp];


NSLog(@"strTimestamp : %@"strTimestamp);

신고
Posted by 그린블로그 DEV그린
2012.07.19 11:03

NSDateFormatter * formatter;

NSString *dateString;

                    

formatter = [[NSDateFormatter alloc]init];

[formatter setDateFormat:@"yyyyMMdd HH:mm"];

                    

dateString = [formatter stringFromDate:[NSDate date]];

                    

[formatter release];

                    

NSLog(@"dateString : %@", dateString );

신고
Posted by 그린블로그 DEV그린
2012.07.18 15:41

UIAlertView* info = [[UIAlertView alloc] initWithTitle:@"" message:@"메시지" delegate:self cancelButtonTitle:@"확인" otherButtonTitles:nil];

[info show];

[info release];

신고
Posted by 그린블로그 DEV그린
2012.06.14 14:54
보통 액티비티에 EditText를 선언해놓으면 

기본적으로 포커싱되서 액티비티가 실행되면 자동으로 자판이 올라오게 되어있습니다.

이것을 조작하는 방법을 알아보겠습니다.

먼저 간단히, 그냥 onCreate()에서 자판이 올라오지 않게 하려면 


AdroidMenifast.xml에 등록해놓은 Activity 애트리뷰트에 


android:windowSoftInputMode="stateHidden|adjustPan"


속성만 주시면 됩니다.



하지만 한 액티비티에서 어떤 경우엔 자판이 올라와야 하고 어떤 경우엔 안올라오게 해야한다면?


위의 속성 그대로에 EditText에 클릭 이벤트를 준 후 


그 이벤트에 InputMethodManager를 이용하여 자판을 띄우면 쉬울 것이라 생각하기 쉽습니다.


ex Fail)


EditText testEdt;

...

testEdt = (EditText)findViewById(R.id.testEdt);

testEdt.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                // TODO Auto-generated method stub

                InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

                mgr.showSoftInput(testEdt, InputMethodManager.SHOW_IMPLICIT); 

            }

        });

     }


그런데 안됩니다.






해결 방법은 간단합니다. android:windowSoftInputMode="stateHidden|adjustPan" 속성을 빼고


EditText 변수에 setInputType(0) 를 선언해주면 됩니다. 


0은 NULL 이라는 소리입니다. 


ex Success)


EditText testEdt;

...

testEdt = (EditText)findViewById(R.id.testEdt);

testEdt.setInputType(0);

testEdt.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                // TODO Auto-generated method stub

testEdt.setInputType(1);

                InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

                mgr.showSoftInput(testEdt, InputMethodManager.SHOW_IMPLICIT); 

            }

        });

     }


InputMethodManager를 빼지 않는 이유는 이것을 뺀다면 두번 터치해야 키보드가 올라오기 때문이랍니다~



신고
Posted by 그린블로그 DEV그린
2012.06.14 10:07


안드로이드 액티비티 생명주기


onCreate()는 액티비티가 시작될 때 한번만 실행되고 


onResume()는 액티비티가 화면에 보여질 때마다 실행된다.


  




신고
Posted by 그린블로그 DEV그린
2012.06.13 17:44


MFMailComposeViewController 를 제대로 쓴 것 같은데 -O Linker (id) Error가 뜨신다면


일단 프로젝트에 MessageUI 프레임워크를 불러와야합니다!



프로젝트의 Tagets로 가서 Link Binary With Libraries로 간 다음 +를 클릭하여 MessageUI 프레임워크를 추가해야합니다.



Add 버튼을 클릭하여 추가시킵니다.


그 다음 .h 헤더 파일에 import와 Delegate를 제대로 해줘야합니다!





#import <UIKit/UIKit.h>

#import <MessageUI/MessageUI.h>  


@interface MailViewController : UIViewController <MFMailComposeViewControllerDelegate> {


}






그 다음 .m 파일에 추가할 것들입니다.





// 메일 컨트롤러 생성. 메일을 보낼 메소드 안에 넣거나 이대로 바로 호출해도 됩니다.

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc]init];

picker.mailComposeDelegate = self;


if ([MFMailComposeViewController canSendMail]) 

    // 메일을 전송할 있는 환경인지 확인.(메일이 설정에서 등록되어 있어야 합니다.)

{

    url = [url stringByReplacingOccurrencesOfString:@"mailto:" withString:@""];

    NSLog(@"MailUrl : %@",url);

    [picker setToRecipients:[NSArray arrayWithObjects:@"jehun7@hanmail.net", @"jehun7@gmail.com", nil]];  //받는 사람(배열의 형태로 넣어도 됩니다. )

    [picker setSubject:nil];  //제목

    [picker setMessageBody:nil isHTML:NO];     //내용

    [self presentModalViewController:picker animated:YES]; // Modal 형태로 창을 띄움니다.

}





//Delegate는 꼭 있어야 합니다.

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error

{

    //상태 결과 값에 따라 처리

    switch (result) {

        case MFMailComposeResultCancelled:  // 취소.

        {

            //알림 창을 띄움.

            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:@"Cancel" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil, nil];

            

            [alert show];

            [alert release];

            break;

        }

        case MFMailComposeResultFailed: // 실패.

        {

            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:@"Failed" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil, nil];

            

            [alert show];

            [alert release];

            

            break;

        }

        case MFMailComposeResultSent:   //성공.

        {

            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:@"Success" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil, nil];

            

            [alert show];

            [alert release];

        }

        default:

            break;

    }

    // Modal창을 닫습니다.

    [self dismissModalViewControllerAnimated:YES];

}









근데 openURL이 더 편합니다..


// 전화걸기

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://전화번호"]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://01012345678"]];



// 메일 쓰기

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://이메일주소"]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://devprograms@apple.com"]];


//SMS 쓰기

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://전화번호"]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://01012345678"]];


// 브라우저 실행

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://url주소"]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunesconnect.apple.com"]];




아니 왜 이렇게 짧아 


// 메일 쓰기
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://이메일주소"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://devprograms@apple.com"]];

// 메일 쓰기
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://이메일주소"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://devprograms@apple.com"]];





신고
Posted by 그린블로그 DEV그린
2012.06.13 08:44


안드로이드에서는 기본적으로 방향 전환을 하면 


onCreate() 가 호출됩니다.


그래서 방향이 바뀔 때 마다 onCreate()에 선언해 놓은 소스들이 재실행되는데 그걸 막기 위해서는


AndroidMenifast.xml 에 선언된 Activity에


android:configChanges="orientation|keyboard"


속성을 추가시키면 방향전환되도 onCreate가 다시 호출되지 않습니다.



신고
Posted by 그린블로그 DEV그린
2012.04.30 16:38

  PackageManager pm = getPackageManager();

   Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
   mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
   List<ResolveInfo> appList = pm.queryIntentActivities(mainIntent, 0);
   Collections.sort(appList, new ResolveInfo.DisplayNameComparator(pm));
  
   Log.d("TEST","Device Name["+android.os.Build.DEVICE+"]");
  
   for(int i=0; i<appList.size(); i++){
    Log.d("INFO","PakageName["+appList.get(i).activityInfo.applicationInfo.packageName+"]");
    Log.d("INFO","ClassName["+appList.get(i).activityInfo.name+"]");     
  }



신고
Posted by 그린블로그 DEV그린
2012.04.09 15:18

아이폰 프로젝트를 체크아웃 받으려다 


host is unreachable


에러가 뜨는 경우가 있습니다.


분명 주소는 제대로 쳤는데 host is unreachable이 뜨는 경우 두가지를 해결책이 있습니다.


1. Xcode는 숫자로 된 아이피 주소를 인식하지 못하는 버그가 있다. 터미널에서 이를 수정해주어야 한다.

2. 터미널에서 svn을 연결시킨 후 다시 실행하본다.




첫 번째 방법은 Xcode가 아이피 주소를 인식하지 못하기 때문에 터미널 /etc/hosts에서 아이피를 도메인으로 설정해줘야 하는 것입니다.


터미널 실행 - sudo nano /etc/hosts - 해당 아이피를 도메인 이름으로 설정.


위의 스크린샷을 예로들면 


192.168.0.1 test.domain.com 으로 수정한 후 


컨트롤+O - Return 버튼 - 컨트롤+X 콤보로 저장 나가기 까지 완료 합니다.


그 후 Oganizer에 다음과 같이 아이피 대신 /etc/hosts 에서 수정한 도메인 명을 입력합니다.


(처음부터 없는 주소기 때문에 Host is unreachable 이 뜨는 것입니다. 제대로 됐다면 제대로 인식됩니다.)


그리고 다음 과정을 진행해주시면 됩니다.



그런데 여기서도 안된다면 터미널에서 직접 SVN을 한번 연결하고 다시 Xcode에서 Organizer에 연결하면 됩니다.


터미널에서 


svn ls svn://192.168.0.1/test


위와 같은 명령어를 입력 해준 후 svn을 연결 시켜놓고 다시 한번 Organizer에서 실행하면 제대로 인식하는 것을 볼 수 있습니다.


그 후 Next - Add 로 마무리 하시면 되겠습니다.


신고
Posted by 그린블로그 DEV그린
2012.04.04 17:07

가끔 어플을 실행하고 작업 관리자를 실행했을 때

제작중인 어플의 CPU 점유율이 100%로 빨갛게 되는 경우가 있습니다.

그 이유는 Thread를 Sleep하지 않았기 때문인데요~

돌리고 있는 Thread가 있다면 Sleep 시켜줍시다~ 

신고
Posted by 그린블로그 DEV그린
2012.03.22 10:47
select * 
from Tname 
where _id between '1' and '10'

테이블명 Tname 에서 _id의 값이 1~10인 값들을 조회한다.

update Tname
    set A = '1' 
where _id between '1' and '10'

테이블명 Tname 에서 _id의 값이 1~10인 값들의 컴럼 A의 값을 1로 바꾼다.
신고
Posted by 그린블로그 DEV그린
2012.03.20 16:43
리스트 어댑터로 리스트 로우에 특정 이미지나 글자를 넣고자 할 때 

첫화면에선 제대로 표기되자만 스크롤을 할 때 갑자기 이미지나 글자가 뒤죽박죽 되는 경우가 있다.

그것은 리스트 어댑터의  getView에서 스크롤 할 때 마다 이전 로우의 값을 기억하고 있기 때문이었다!!

스크롤을 할 때 마다 불려지기 때문에 이미 사용된 값을 재사용 하기 때문에 다음 로우가 괴상하게 뒤바뀌는 것이었다.

가령 처음 로딩 했을 때

1
2
3
4
5
6
...

이던 것이 

스크롤을 밑으로 한번 내리고 나면 

....
4
5
6
6
6
6

이런식으로 변하고 다시 올리면

6
6
6
6
6

1,2,3,4,5의 값조차 이렇게  6으로 바뀌는 것이다. 

해결책은 간단했다.

이것을 막기 위해서 getView 초기 부분에 로우의 해당 데이터 값을  null로 선언하니까 정상적으로 출력되었다.  

버그인지는 모르겠으나 스크롤 시 값이 뒤죽박죽이 된다면 필시 어댑터의 getView 떄문일 것이다. 


 
신고
Posted by 그린블로그 DEV그린