본문 바로가기

개발64

Dialog를 닫았는데 background로 나갔다 들어오니 다시 열린다??? 안드로이드에서 대화상자를 띄울때 DialogFragment를 사용한다. 그런데 사용후 닫았는데도 화면을 끄거나 홈버튼을 누르거나 다른 앱을 잠시 사용한후 들어오면... 닫혔던 DialogFragment 놈이 되살아나 다시 뜨는 경우가 있다. 알고보니 dismiss 리스너를 등록하면 그런다. 즉, setDismissListener에 리스너를 넣었다면 반드시 종료할때 dismiss()를 호출해주어야 한다. 그러지않고 back 버튼이나 바깥화면 터치로 닫으면 나중에 다시 떠버린다. 당황하지 말고 다음과 같이 하자... dialog.setOnDismissListener { //리스너 내용 } dialog.setOnKeyListener { dialogInterface, i, keyEvent -> if (keyEv.. 2019. 3. 13.
EditText에 자동으로 단위 콤마 넣기 NumberFormat 을 이용하면 숫자에 단위 콤마를 쉽게 찍을수 있다. 하지만 이를 EditText에 적용할려고 하면 한가지 문제가 생긴다. 입력할때마다 콤마가 찍혀야 하는데... addTextChangedListener에서 NumberFormat으로 콤마를 찍으면 당연히 텍스트가 변경되므로 다시 리스너가 호출된다. 즉, 호출이 무한 반복되면서 앱이 멈추게 된다. 그래서 살짝 꼼수를 부려봤다. EditText 밑에 같은 크기의 TextView를 깔고 여기에 콤마를 찍은 텍스트를 대신 써주고, 후에 EditText를 동기화 하는 것이다. 물론, EditText는 투명하게 설정해 안보이게 한다. 사실 임시 방편으로 만든것인데.. 생각보다 잘 작동해 계속 쓰고 있다 ㅎㅎㅎ 소스는 다음과 같다. 요즘 뜨고 .. 2019. 1. 17.
round()를 5의 배수로도 반올림 해보자 왜 반올림은 0으로만 할까? 0말고 다른수로도 반올림 해보는건 어떨까? 라는 생각을 가끔씩 해봤는데.. 솔직히 별 필요성을 느끼지 못했었다. 그런데 주식 관련한 로보어드바이저를 만들면서 필요해졌다. 호가를 찍을때 5단위가 되기 때문이다. 아래와 같이 php의 반올림 함수인 round()를 이용하여 5의 배수로 반올림 해주는 코드를 짜봤다. 원리는 굳이 설명안해도 될만큼 간단하다. 여기서 볼것은 round() 함수의 두번째 인수인 반올림 자릿수도 고려한다는 사실이다. 이러한 편리한 기능은 살려놔야 코딩하는 재미가 있다ㅎㅎ function roundCenter($price, $precision) { //지정한 자릿수로 반올림 (1) $round = round($price, $precision); //지정한 .. 2018. 11. 26.
sqlite의 time이 자정을 인식 못할 경우, 간단한 꼼수 해결법 안드로이드의 sqlite 데이터베이스를 사용하는 도중 이상한 점을 하나 발견했다. time 데이터타입에서 00시 또는 24시, 즉 자정일때 time() 함수가 먹히질 않는다는 점이다. 예를 들면, (time 데이터타입의 field1 시각 + int 데이터타입의 field2 초) > 특정시각 을 비교할때 SELECT * FROM table1 WHERE time(field1, field2 ||' seconds') > 23:59:30 와 같이 사용한다. 하지만 이때, field1이 23:59:00 이고 field2가 60초 이상이면 자정이 넘어가면서 SELECT 결과가 항상 아무것도 안나오게 된다. field1이 24:00:00 이상이어도 마찬가지다. 이걸 해결하기 위해 만방으로 살펴봤지만... 역시 코딩은 .. 2018. 9. 27.
스레드에서 반복문으로 UI를 변경할때 주의할점 내가 만든 스레드에서 UI를 바꿀수 없다는것은 누구나 알것이다. 물론 젖먹이 개발자 시절에 난 몰랐다... 어잿든 내 스레드에서 UI를 바꿀려면 메인스레드를 호출해야 한다. ios 에서는 DispatchQueue.main.async 이 그 역활을 한다. 짐작했겠지만 메인스레드는 새로 만들어지는게 아니므로 당연히 동기적으로 움직인다. 최근까지도 이 사실을 자주 망각했다. 바로 반복문에서 메인스레드를 호출할때였다. 내 스레드에서 메인스레드를 반복문으로 돌릴때는 서로가 따로 놀기 때문에 (내 스레드와 메인스레드가 서로 비동기라서) 메인스레드에서 UI가 아직 변경되지도 않았는데 내 스레드에서 또 호출해 버린다. 이렇게 되면 버벅거리는 현상이 발생한다. 테스트할때서야 버벅거림을 발견하고 짜증내다 아... 하고 숙.. 2018. 7. 30.
Intent 전달 방식을 모방하여 부모 activity를 호출하기 IOS에서는 prepare()을 통해서 부모 controller를 쉽게 전달할 수 있다. 하지만 Android에서는 Intent로 activity를 전달하기 쉽지 않다. 뭐, Intent 말고도 여러 전달 방식이 있기 때문에 상관없지만... 깔끔하게 코딩하고 싶은 마음에 함 만들어 보았다. static을 이용하지만, 마치 Intent로 전달하는것 같은 느낌으로ㅎㅎ public class BaseActivity extends FragmentActivity { private static final String KEY_PARAM_CONTEXT_ID = "ParamContextId"; //전달할 Context를 담는 Map private static HashMap mParamContextMap = null; /.. 2018. 6. 7.
UIEdgeInsets 없이 UILabel에 여백 넣기 UILabel에 여백을 넣는 방법은 다양하다. 그 중 NSLayoutConstraint를 이용하는 법을 다뤄보자! class FitLabel: UILabel { //상하좌우 여백 storyboard 입력값 @IBInspectable var edge: CGSize = CGSize(width: 0, height: 0) //너비, 높이가 적용될 Constraint private var mWidthConstraint, mHeightConstraint: NSLayoutConstraint? //좌우 여백값 var edgeAllWidth: CGFloat { return edge.width * 2 } //상하 여백값 var edgeAllHeight: CGFloat { return edge.height * 2 } ove.. 2018. 5. 8.
손쉽게 아이폰 앱을 새로 실행 시키는 코드 한줄 안드로이드에서는 메인 activity를 종료하고 다시 호출하면 바로 재시작이 된다. 하지만 아이폰에서는 그렇게 할수가 없었다. 혹시나 하는 마음에 재시작 시키는 함수를 찾아봤지만 이 또한 없었다. 나의 구글링 실력이 부족해서 못찾은거일수도 있지만... 좌절하고 있는 순간... 정말 우연하게 방법을 알아냈다. 사실 실수로 코드를 잘못 넣었는데... 재시작이 되는것이다... 아! 실수로 찍은 로또나 될것이지.. 어쨋든 기분은 좋다. 불로소득같은 느낌이다. 방법은 진짜 간단하다. AppDelegate 의 applicationWillEnterForeground 에서 exit(0)를 호출해주면 된다. 아마도 잠에서 깨어나기 직전에 종료를 해주면 깨어나는 작업이 중단되지 않고 계속 진행되면서 재시작되는 효과가 나오.. 2018. 3. 26.
UIView의 원 테두리가 얇거나 작아보일때... 가끔 우리는 아주 사소한 차이로 고민할 때가 있다. 이거 왜이러니? 기분탓인가? 한번 살펴볼까? 귀찮다 이정도쯤이야 뭐.. 하고 지나친적이 있지 않은가ㅎ 나는 많다ㅎㅎ 최근에도 그랬다. UIView에서 StrokeEllipse 를 이용해 rect 크기 만큼 원 테두리를 그릴수 있다. 하지만 그려 놓고 나니 왠지 생각보다 작아보였고, 안에 색깔있는 원을 넣으니 테두리 굵기마저 얇아 보였다.. 뭐지??? 처음엔 그냥 지나쳤다가 똥싸고 손안씻은것처럼 찝찝해서 한번 살펴보았다. 바보같았다... 왜 몰랐을까? 테두리 굵기는 양쪽으로 넓어진다는 사실을... 그래서 한쪽 굵기만큼 반이 얇아지고 작게 보이는 것이었다. 아래와 같이 하면 금방 해결된다.. 혹시나 귀찮아서 그냥 지나칠 분들을 위해 글을 남긴다. @IBIn.. 2018. 1. 29.
NSString을 마치 UILabel인 양 사용하기 UILabel을 추가하면 간단하게 글자를 넣을 수 있다. 하지만 sub view가 많아지면 어플이 무거워 질 수 있는데 이럴때에는 NSString을 써주면 좋다. 그렇다면 NSString를 UILabel처럼 배경색을 넣어서 마치 view인듯 사용해 보자~ 먼저, NSString이 들어있는 클래스를 하나 만들자! NSString를 상속받아 확장해도 좋다. 나는 그냥 했다. TextBox라고 명명하겠다. class TextBox { //정렬키 상수 static let CENTER = 0 static let LEFT = 8 static let RIGHT = 16 static let TOP = 1 static let BOTTOM = 2 var mText: NSString var mAlign: Int var mF.. 2017. 11. 20.