본문 바로가기

반응형

Android

특정 기기에서 DatePickerDialog, TimePickerDialog에서 '설정', '취소' 가 나오지 않고 '저장'으로 표시되는 경우 내 LG의 LTE2 모델의 경우 저런 오류(?)가 발생한다. 저렇게 표시만 되면 다행인데, 취소버튼이 없어서 뒤로가기 버튼을 눌러도 '설정'버튼을 누른 이벤트가 정상적으로 실행이 되고, '저장'버튼을 누른 경우 '설정'버튼을 누른 것 같은 이벤트가 2회 발생한다. 구글링결과 안드로이드 특정 버전에서 위와 같은 오류가 알려져있다고 한다. 이를 해결하기 위해서 소스를 간단히 수정해 보았다. // 한번만 실행하기 위한 체크변수 int nCheck = 0; @Override protected Dialog onCreateDialog(int id) { switch (id) { case DATE_DIALOG_ID: // 날짜선택 다이얼로그 호출 DatePickerDialog dialog = new DatePicker.. 더보기
안드로이드 해상도별 아이콘 사이즈 애플의 아이폰과 같이 단일화된 기기에 특정 해상도만 가진 기기를 타겟으로 개발하는 반면, 안드로이드는 다양한 해상도, 픽셀밀집도가 각각의 기기마다 다르기때문에 디자인에서 정말 고달픕니다. 기본적으로 안드로이드에서 아이콘을 하나 제작하더라도 배포용 512x512 사이즈의 이미지가 필요하고, 추가로 지원하는 기기의 dpi에 따라서 아이콘을 사이즈별로 준비해야 합니다. dpi에 따른 아이콘 사이즈는 구글에서 정의하여 같은 사이즈로 배포해야 합니다. 기기에 따라서 아이콘의 해상도가 정확하게 일치하지 않으면 아이콘을 화면에 보여주지 않는 기기도 종종 있습니다. (지금 기억은 안나는데 아이콘 사이즈에 신경안쓰고 테스트 중이던 프로그램이 그런 경우가 있었습니다.) 최근 xxhdpi이라는 해상도가 추가되었습니다. 최근.. 더보기
AsyncTask 사용중 java.lang.ExceptionInInitializerError 처리방법 안드로이드에서 AsyncTask 관련 문서를 보면 중요한 내용중에 하나가 분명히 Main Thread 에서 실행되어야 한다는 것입니다. 그런데 안드로이드 개발을 하다보면 UI스레드를 얻기위해서 항상 Context를 파라메터등으로 넘겨주고 하는 고생(?)을 매번하게 됩니다. 간단히 Handler를 이용하여 UI스레드를 획득하여 제목에서 보이는 예외를 피하는 코드를 만들어 보겠습니다. // UI스레드에서 작동됩니다. new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { UserDefineTask task = new UserDefineTask(); task.execute(); } }); 어딜봐도 Contex.. 더보기
앱 process 종료하기 안드로이드 프로그램을 프로세스 수준에서 완전히 중지하는 방법을 검색해보니 대부분 killProcess 방식으로 처리하는 것이 대부분이었습니다. 권장하지도 않는 방법이고, 단순히 프로그램 완전종료를 위해서 별도의 퍼미션을 추가해야 한다던지(관심없는 사용자들이 대부분이지만 말입니다.) 그다지 좋은 방법으로 보이지 않습니다. 해서 이것저것 해보다가 일단 저에게 맞는 방법을 찾아서 몇자 적어봅니다. 아래 이미지와 같이 eclipse를 통해서 프로그램을 실행하고 각 기기에서 프로그램을 처음 실행한 엑티비티까지 모두 onDestroy()를 탄 상황임에도 불구하고, 모두 프로세스는 그대로 남아있습니다. 사용했던 메모리도 그대로 보존하고 있죠.. 이녀석들이 도대체 언제 내려갈지 아무도 예측할 수 없습니다. 이래저래 몇.. 더보기
젤리빈기반에서 DatePickerDialog 에서 취소버튼 이벤트 처리하는 방법 젤리빈으로 롬업데이트가 활발한 요즘, 개발자들은 이전보다 더 많은 것을 신경쓰고 이벤트처리에 신경을 써야 합니다. 가장 많은 골머리를 썩는 것중에 하나가 소프트버튼 또는 하드버튼으로 입력하는 취소처리, 다이얼로그의 OutSide를 클릭하여 취소하는 경우의 이벤트 처리가 그것일 겁니다. 그중에서 DatePickerDialog는 기본적으로 Positve버튼과 Cancel버튼이 기본적으로 달려있고, Positive버튼의 이벤트 처리는 다이얼로그 생성자에서 기본적으로 입력을 받습니다. DatePickerDialog dialog = new DatePickerDialog(getActivity(), dateOnDateSetListener, year, month, day); 요런식으로 말이죠..dateOnDateSet.. 더보기
ListView에서 동적 추가시 하단으로 자동이동 또는 강제이동 리스트뷰에서 동적으로 row가 증가함에 따라 자동으로 이동하게 해주는 옵션이 존재한다.layout 의 xml 에서 ListView의 속성중에 android:transcriptMode 의 속성을 적용하면 된다. 설정할 수 있는 값은 아래와 같다. ConstantValueDescriptiondisabled0Disables transcript mode. This is the default value.normal1The list will automatically scroll to the bottom when a data set change notification is received and only if the last item is already visible on screen.alwaysScroll2The .. 더보기
안드로이드에서 마켓 연동 종종 다른 프로그램이 설치되어있는지 확인하고 없는 경우 해당 프로그램을 다운로드 하기 위해서 마켓 프로그램을 실행하여 해당 프로그램을 바로 설치할 수 있도록 해야 하는 경우가 있습니다. 그럴 때 아래 코드를 사용하여 일반적인 엑티비티를 실행하듯 프로그래밍해주시면 됩니다. // java code // 안드로이드마켓에서 Apps 검색 Uri uri = Uri.parse("market://search?q=pname:프로그램_패키지_명"); // ex) 프로그램_패키지_명 = com.google.maps Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); // 안드로이드마켓의 App 상세 화면 Uri uri = Uri.parse.. 더보기
뷰(View)의 사이즈를 pixen단위로 알아내기 원문 링크 전체 화면 크기(기기의 해상도) 를 알아내려면 다음 메서드를 호출하면된다. getWindowManager().getDefaultDisplay().getWidth(); getWindowManager().getDefaultDisplay().getHeight(); 이 메서드들은 각각 기기너비와 높이를 돌려준다. 안드로이드는 여러 기기에서 실행될 수 있으므로 기기의 해상도에따라 코딩을 다르게 해야할때 유용하다. 뷰의 크기를 알아낼때는 getWidth() getHeight() 메서드를 이용한다. 이 메서드들은 각각 뷰의 너비와 높이를 알아낸다. 화면을 꽉 체운 뷰라고 하더라도 화면의 해상도와 뷰의 크기는 다른데 이유는 상단에 위치한 상태바때문이다. 화면을 가득 채운 뷰는 기기의 해상도 높이에서 상태바의.. 더보기

반응형