현재 회사의 앱에서 영어와 한국어, 이렇게 두 글로벌 언어를 두고, 기기에서 언어에 맞게 대응하고 있다. 그러다가, 자바 코드에서 언어뿐만 아니라, 해당 언어에 따라, ui나 메서드를 달리하고 싶은 일이 생겼다. 그렇게 해서 알아낸 코드가 이것이다. Locale mSysLocale = getResources().getConfiguration().locale; String strLanguage = mSysLocale.getLanguage(); 다음 코드를 사용하면, 현재 디바이스에 설정되어 있는 언어 코드가 String에 담긴다. 메서드를 만들어 예를 들면 public class MainActivity extends AppCompatActivity { @Override protected void onCre..
하 정말 감격스러운 순간이다. 앱 개발자를 시작한 이례로 딱 두 번 앱을 출시했다. 첫 번째 앱은 "그만 : 금연 다이어리" 앱이다. 취업을 위한 첫 포트폴리오를 위해 만들었던 앱으로, 정말 한 땀 한 땀 정성스레 만들어 4개월 만에 만들었다. 지금 만들라고 하면, 한 달이면 가능할 것 같다... 하지만 그 앱은 망했다.. 멋진 추억이지만, 사용자수도 10명 안팎이었고, 서버 비용도 들어서.. 그냥 추억은 추억으로 묻어두고 싶어, 앱을 플레이스토어에서 내렸다. 그렇게 시간을 흘러 나는 앱 개발자로서 직장을 다니던 무렵, 요소수 대란이 찾아오게 되었다는 소식을 화물을 하시던 아버지께 들었다. 뭔가 좋은 방법이 없을까 생각하던 중에 혹시나 하고 공공데이터 포털 사이트로 들어가게 된다. 그곳에는 무료로 국가에..
요소수 앱이 벌써 다운로드 100회를 돌파했다!! 아 지금은 이 얘기보다는 새로운 회사에 들어가 내가 모르고 커밋을 실수로 하는 바람에 쓸데없는 커밋이 깃허브로 푸시되었다. 자 간단하게 지우는 법을 알아보자. 우선 커밋 내역을 확인하자 터미널에 다음과 같이 입력한다. (Android Studio 터미널이나 맥 터미널 윈도는 명령 프롬프트) git log 커밋 내역을 확인하는 기능인데, 사실 이 기능은 어떤 커밋이 있나 확인만 하는 거라 굳이 안 해도 된다. git reset HEAD^ 이렇게 입력하면 최근 커밋이 하나 사라진다. 아쉽게도 내가 어떤 특정 커밋을 지우는 법은 잘 모르지만, 순차적으로 최신 것부터 차례대로 지우는 법만 알고 있다. 만약 여러 개를 지우고 싶다면 git reset HEAD~n ..
이 글은 잭 코딩님의 글을 참조했습니다. https://jackjeong.tistory.com/100 [Java] Shallow copy(얕은 복사) vs Deep copy(깊은 복사) 안녕하세요~ 잭코딩입니다! 이번 내용에서는 Shallow copy(얕은 복사)와 Deep copy(깊은복사)를 살펴봅시다 코드를 짜다보면 객체를 복사해야할 경우가 생깁니다 이 때 실수로 복사를 잘못하면 큰 이 jackjeong.tistory.com 코딩 중에 갑자기 문득 궁금한 게 생겼었다. 나 같은 경우는 리사이클러뷰 어뎁터를 사용하다가 검색창 기능을 만들기 위해 같은 ArrayList를 두개 만들어주고, 똑같은 값을 이런 식으로 넣어 주었다. 그런데 이렇게 값을 넣어주는데, 검색을 해도 아이템이 나오지 않았다. 구글링..
2021.11.26 - [Programing/Android Studio With Java] - Android Studio/ Java Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. 오류 해결하기 TIL # 71 Android Studio/ Java Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. 오류 해결 안드로이드 스튜디오에서 자바로 main를 두고 어느 때와 다름없이 RunTime 버튼을 눌렀는데 다음과 같은 오류가 떴다. Deprecated Gradle features ..
안드로이드 스튜디오에서 자바로 main를 두고 어느 때와 다름없이 RunTime 버튼을 눌렀는데 다음과 같은 오류가 떴다. Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. 빌드 시에 deprecated 된 기능들이 있어서 현재의 gradle과 호환이 맞지 않다는 이야기이다. 그 아래에 --warning mode all을 사용하라고 명시까지 해주었다. 그렇다면, 이 녀석을 어디서 사용할까? 맥은 preferences로 윈도는 settings로 가게 되면, Build, Execution, Deployment -> Compiler를 들어가면, Command-line Options 입력창에 --w..
최근 sdk 버전 31까지 나와 이러한 오류가 뜬 것 같다. The minCompileSdk (31) specified in a dependency’s AAR metadata is greater than this module’s compileSdkVersion 이 말인즉슨, 현재 사용되는 라이브러리 패키지들의 최소 sdk 버전이 이 앱의 compileSdkVersion 보다 크다고 한다. 그러면 우리는 compileSdkVersion을 31로 바꾸어 주면 된다. android { compileSdkVersion 31 //
개발 공부도 좋지만, 역시 성공을 하려면 돈을 벌고, 그 돈을 어떻게 쓰는지가 중요하다고 생각한다. 돈은 유동적이야 그 가치가 생긴다고 생각한다. 돈을 벌고 투자를 하는 법을 알아보자. 그래서 시작한게, 주식 책을 산 것이다. 주식 책을 하루에 30분정도라도 보면서 이렇게 배운 것을 정리하려고 한다. 지금은 초반이니까 그냥 무지성으로 필기했던 것을 쓰려고 한다. 이렇게 하는 게 맞겠지.. 하하 참고 책 : 왕초보 주식 투자 시크릿 (박동우) 2011년 1월 주식 투자자는 460만명에 달한다. 시가총액은 1300조 원에 이른다. 2010년 7월에는 외국인 투자자가 3만명을 돌파했다. 1년 동안 돈을 가장 많이 번 수단이 부동산 다음으로 주식이 높았다. 주식은 기본에 충실해야 한다. 남들이 많이 사는 종목이..
로딩 창을 간단히 띄우는 법에 대해 소개하려고 한다. 우선 로딩 창 화면을 만들기 위해 SplashActivity라는 이름으로 EmptyActivity를 하나 만들어 주자. 현재 나는 뷰바인딩을 같이 쓰고 있는 상태이다. public class SplashActivity extends AppCompatActivity { ActivitySplashBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivitySplashBinding.inflate(getLayoutInflater()); setContentView(binding.get..
네이티브로 돌아온 느낌은 꽤나 신선하다. 오늘은 현직에서도 자주 사용되고 있는 Retrofit을 다루려고 한다. 보통 서버 api 통신을 할 때 편리하고 간단하게 사용될 수 있는 라이브러리로써 많은 사람들에게 사랑받고 있는 라이브러리라고 할 수 있다. 그렇다면 한 번 예제를 봐보자. 사용법 dependencies { //retrofit2 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' } 우선 이 두 종속성을 build.gradle(:app)에 추가를 해주는 것으로 시작합니다. 최신 버전이 있다면 버전을 올려주세요! 여기서 잠깐 알고 갈 것!! g..
앱 출시일 현재 앱 검토 중이니 느리면 1주일에서 2주일 정도 소요될 것 같습니다ㅠㅠ 빠르면 4일 안에 검토 완료되고 배포 될 것 같습니다. 앱을 만들게 된 계기 시작은 요소수 대란이 일어나고, 운수업을 하시던 아버지께서 부족해진 요소수로 인해, 물량이 있고, 싼 가격에 거점 주유소를 찾기가 힘들어졌고, 화물 운수를 종사하시는 분들이 단톡방을 만들어서 서로 공유를 주고받고 있으시다는 걸 알게 되었다. 그 와중에 나 또한 플러터 회사에서 네이티브로 옮기게 되면서, 한 번 엄청난 기능은 아니지만, 오랜만에 네이티브도 경험할 겸, 도움도 될 겸, 저 데이터들을 편하게 볼 수 있는, 굳이 정부 데이터 사이트 들어가서 정보를 가져오는 번거로움을 줄이고자, 앱을 만들자고 생각이 들었다. 그래서 부리나케 앱을 만들었..
지금 회사에서 플러터를 거의 마무리하면서, 내가 토이 프로젝트를 하지 않는 이상 이제 플러터와는 살짝 멀어지면서, 네이티브에 더 집중할 것으로 예상이 된다. 오늘은 이전 글이었던, 2021.10.04 - [Programing/Android Studio With Kotlin] - flutter/dart /JSON과 직렬화 api 서버통신 자동으로 만들기 / retrofit, dio, retrofit_generator, build_runner, json_serializable /TIL # 64 flutter/dart /JSON과 직렬화 api 서버통신 자동으로 만들기 / retrofit, dio, retrofit_generator, build_runner, json_ 오늘은 api 서버통신에 대한 글을 작성..
예전에 봐둔 내용이지만 유용할 수 있어서 정리 해본다. 맥북을 이용하면서 플러터를 사용하다보니 App Store에서 Xcode를 업데이트하라는 메세지를 받게 되어 업데이트를 진행하였다. 그런데... 무슨 3시간이 지나도 끝 지점에서 그대로 있는 것이다.. 구글링을 해보니 8시간 기다려도 그대로인 사람도 있다고 하더라. 앱 스토어 리뷰를 보니, 엑스코드 자체가 설치가 굉장히 느린 듯하다. 다른 사람들도 비슷한 피해를 입은 듯하다. 빠르게 설치하는 해결법은 다음과 같다. 해결법 차리리 이렇게 업데이트하는 것보다 삭제하고 다시 설치하는게 더 빠르다는 의견을 보았다. 그러나, 앱스토어에서 다운을 받으면 안된다. (이상하게 앱스토어에서 다운을 받으면 느렸다.) http://developer.apple.com/do..
여느 떄와 같이 플러터 작업을 하던 중에 저런 오류가 떴다. 일시적인 오류로 디바이스를 찾지 못하는 이유인 것 같아서, 구글링을 해보니 해결법은 생각보다 간단했다. 아이폰 시뮬레이터에 경우에는 기존 바탕화면에 설치되었던 앱을 삭제하고, usb 포트를 뽑고 다시 연결 후 앱을 빌드하면 정상 빌드가 되고, 안드로이드 같은 경우는 Tools -> AVD Manager로 들어가 해당 안드로이드 기기를 Wipe Data(데이터 초기화) 해주고, 다시 재빌드를 해보면 정상 작동하는 것을 알 수 있다. 끝!
코딩을 하다 보면 배우고 싶거나 모르는 라이브러리에 대한 소스코드를 찾아다니게 된다. 나 같은 경우는 githup에서 소스코드를 찾는 경우가 있는데, 깃 헙 홈페이지에서 소스를 참고하면서 라이브러리 예제를 보면서 적용을 할 수가 있다. 혹은 예제 소스를 그대로 다운을 받아 우리가 빌드를 해보려고 시도하는 경우가 있는데, 아주 자주자주 이 오류와 마주치게 된다. could not resolve com.android.tools.build:gradle:x.x.x. could not resolve all files for configuration ':classpath'. No cached version of com.android.tools.build:gradle:4.0.0 available for offline..
오늘은 api 서버통신에 대한 글을 작성하려 한다. 참고 자료는 코딩 팩토리님의 영상과 아래 공식 문서를 참고했다. https://flutter-ko.dev/docs/development/data-and-backend/json JSON과 직렬화 어느 시점부터 웹 서버와 통신하지 않거나 구조화된 데이터를 적절하게 보관하지 않는 모바일 앱을생각하기 어려워졌습니다. 네트워크와 연결된 앱을 제작할 때, 결국에는 제법 괜찮은 JSON을사 flutter-ko.dev 우선 이 직렬화를 자동으로 쓰지 않으면 생길 수 있는 문제점에 대해서 설명하겠다. 보통 우리가 서버에서 api를 통해 json 데이터를 받아오는데, 모델 클래스를 만들어 받는 경우가 흔하다. class User { final String name; fi..
오늘 벌써 글만 3개째이다. 공부량이 많은 만큼 좋다고 생각한다. 오늘도 역시 깡샘의 안드로이드를 출처로 한다. 오늘 배울 것은 코틀린의 컬렉션 타입이다. Array - 배열 표현 코틀린의 배열은 Array라고 표현하며, 첫 번째 매개변수는 배열의 크기를 지정하며, 두 번째 매개변수는 초기값을 지정하는 함수이다. (size: Int, init: (int) -> T) 예를 들어 이렇게 선언할 수 있다. val data: Array = Array(3, { 0 }) 배열의 데이터에 접근할 때는 대괄호([])나 set(), get() 함수로 값을 넣어주거나 가져올 수 있다. fun main() { val data1: Array = Array(3, { 0 }) data1[0] = 10 data1[1] = 20 d..
예전에도 이와 비슷한 글을 올린 적이 있다. 2021.07.27 - [Programing/Android Studio With Flutter(Dart)] - Flutter/Dart 리스트 슬라이드 로딩 구현 SmartRefresher 사용법 / Refresh 새로고침 구현 하기 TIL # 47 Flutter/Dart 리스트 슬라이드 로딩 구현 SmartRefresher 사용법 / Refresh 새로고침 구현 하기 TIL # 47 요즘 뜻대로 코드가 잘 짜여서 기분이 좋다. 오늘은 회사앱에도 적용 SmartRefresher이라는 패키지에 대해서 소개해 볼까 한다. https://pub.dev/packages/pull_to_refresh/install pull_to_refresh | Flutter Pa.. d..
이 글은 코딩 팩토리님의 equatable 강의를 바탕으로 참고했습니다. 이제 회사에서 새로운 앱을 만들기 앞서, 필요한 플러터 지식을 쌓기 위해 고전해야겠다고 생각이 들어 필요할 것 같은 플러그인을 찾고 있는 중이다. 그중에 Formz라는 로그인 기능 구현 시 유용한 플러그인을 발견하게 되었는데, 같이 사용할 수 있는 Equatable이라는 플러그인을 알게 되었다. Formz를 배우기 앞서 Equatable에 대한 개념을 잡고 가고자 한다. 객체의 인스턴스 우선 인스턴스에 대해 알아볼 필요가 있다. 객체의 인스턴스에 대한 개념은 지난 싱글톤 글에 대해서 설명한 적이 있다. 2021.07.11 - [Programing/Android Studio With Flutter(Dart)] - flutter/Dar..
2021.09.29 - [Programing/Android Studio With Kotlin] - Android/ kotlin 코틀린 변수와 함수 정리(1) / 데이터 타입과 문자열, lateinit, lazy등등 # TIL 58 Android/ kotlin 코틀린 변수와 함수 정리(1) / 데이터 타입과 문자열, lateinit, lazy등등 # TIL 58 플러터를 사용하면서 동시에 코틀린을 공부하려고 한다. 하이브리드 앱이 대세라고 하지만, 주 언어로 네이티브를 가져가고 싶은 욕심이 커서 동시에 공부 중이다. 역시 나는 do it 책에서 헤어 daldalhanstory.tistory.com 우선 앞서 공부했던 첫번째 글부터 보고 오시면 이해가 빠르실 겁니다. 두번째 공부내용을 정리해보겠습니다. 저번..
flutter 공부를 하면서, 따로 코틀린을 오랜만에 실행 중에 오류가 발생했다. An exception occurred applying plugin request [id: 'com.android.application'] > Failed to apply plugin 'com.android.internal.application'. > Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8. You can try some of the following options: - changing the IDE settings. - changing the JAVA_HOME environment variable. - changing ..
플러터를 사용하면서 동시에 코틀린을 공부하려고 한다. 하이브리드 앱이 대세라고 하지만, 주 언어로 네이티브를 가져가고 싶은 욕심이 커서 동시에 공부 중이다. 역시 나는 do it 책에서 헤어 나오질 못한다.. 너무 정리가 잘되어 있다. 책에서 배운 내용을 정리하고자 한다. 출처는 do it 깡샘의 안드로이드 앱 프로그래밍 with 코틀린에서 가져왔다. 코틀린의 변수와 함수 1. 변수 선언 코틀린에는 크게 두가지의 변수 키워드가 있는데 var(value)와 val(variable)이다. 언뜻 보면 비슷하지만, 둘은 엄연히 다르다. val 같은 경우는 초깃값이 할당 되면 바꿀 수 없는 변수를 선언할 때 사용하고, var는 초깃값을 할당해도 추후에 바꿀 수 있는 변수를 선언할 때 사용한다. 코드는 아래와 같다..
이따금씩 플러터 앱을 실행하면 이러한 오류가 뜬다 영어 뜻대로 flutter를 실행하기 위한 cocoaPods의 저장소가 오래되어, 종속성을 충족하기 어려워 Pod 레포지터리 업데이트를 해주세요. 라는 뜻이다. 그렇다면... 해줘야지.. 우선 왼쪽에 프로젝트 창에서 ios 안에 Podfile.lock을 지워준다. 저기 연두색 Podfile.lock을 우선 지워준다. 그러고 나서 터미널 창에 다음과 같은 명령어를 입력해준다. cd 내 앱이 있는 경로/ (ex test앱이라 가정할 때, folder/test) 입력한다. 그다음에는 cd test/ios를 입력하여 ios로 들어가 준다. pod install --repo-update 라고 입력하고, 앱을 실행해 보자. 만약에 아래와 같은 오류가 뜬다면 지정된 ..
참으로 기이한 일이다. 이 오류로 오전 시간을 다 까먹었다. 요즘 여러 플러그인을 설치하면서 재미를 느끼는 와중에 아래 영상과 같은 오류가 떴다. 각 다트별로 화면에 들어가면, 흰색 두꺼운 커서가 뜨면서 한글 입력이 안 되는 것이다. 웃긴 거는 영어로 입력한 뒤에 한글을 입력하면 해결이 되었는데, 매번 이런식으로 불편을 겪고 싶지 않았다. 일단 원인이 뭔지 모르는 상황이었는데, 다행히 해결책을 찾았다. 우선 저 두꺼운 커서는 아래와 같이 없애준다. 맥 기준으로 preferences 위에 녀석을 해제하면 두꺼운 블락이 사라진다. 그렇다면 한글이 안쳐지는 원인은 무엇일까? 찾아보니 이 녀석이 문제였다. 이유는 정확히 모르겠으나, 이 ideaVim이라는 플러그인을 비활성화하니 한글이 정상적으로 나오는 것을 확..
안드로이드 네이티브 개발자들에게는 익숙한 바텀 내비게이션 탭 바에 대해서 글을 작성하려고 한다. 갓러터에서 이와 비슷한 패키지가 있다. 따로 외부에서 가져오지 않아도, 내부 패키지에 있기 때문에 그대로 사용해도 된다. 바로 DefaultTabController이다. 위에 사진은 내가 간단한 프로젝트를 위해 사용한 탭이다. 위와 같은 탭바를 코드로 살펴보자. 사용법 나같은 경우는 main.dart에서 맨 처음 앱 화면에서 사용하기 때문에 (보통 이런식으로 한다) Scaffold를 DefaultTabController로 감싸준다. return DefaultTabController( length: 3, child: Scaffold( ... ) ... ); length는 총 아이템에 개수를 이 메서드에게 알려주..
회사에서 다음 앱을 출시하는 동안, 앞으로 많이 사용하게 될 MediaQuery에 대해 공부한 내용을 적는다. 유튜브 코딩 파파를 참고했다. MediaQuery 반응형의 따른 앱 내의 패키지이다. css에서 쓰인다. 보통 디바이스마다 가로나 세로 길이가 다르기 때문에 앱에 사이즈에 맞는 가로나 세로의 값을 가져오는 것이 일반적이다. 보통의 사용법 MediaQuery.of(context).size.witdh //앱 디바이스의 가로길이 MediaQuery.of(context).size.height //앱 디바이스의 세로길이 보통 다이얼로그나 혹은 사이즈를 넣어줘야 하는 Container나 Text 등등, 앱마다 각각 다른 사이즈로 화면에 표시된다. 그래서 위와 같은 사이즈를 두어, 디바이스의 크기에 대한 대..
최근에 배운 게 많아 벌써 하루에 두 개의 글을 쓴다. 이번 기능은 생각보다 어렵지 않기 때문에 금방 끝내려고 한다. 이번 기능은 저번 예제에서 사용했던 AnimatedContainer와 연동해서 사용한 예제를 보여주려고 한다. 예제라기보다는 어떻게 사용하는지 말이다. (예제 코드 만드는 게 여간 힘들다...) 우선 Gif 파일을 준비 해준다. gif는 구글에 치면 많이 나온다.. 아래와 같은 기능을 할 것이다. AnimatedContainer 기능은 저 사각형의 다이얼로그를 동그랗게 shape 할 때 사용하였는데, 방법은 이전 글에 있으니, 우선 이 것부터 보고 오면 좋을 듯싶다. 2021.09.16 - [Programing/Android Studio With Flutter(Dart)] - flutte..
오늘은 애니메이션 처리에 대해 글을 쓰려고 한다. 여러 유용한 패키지가 있었지만, 기존 flutter가 가지고 있는 AnimatedContainer를 한번 사용해 보려고 한다. 우선 flutter ui가 나는 아직 미숙하므로, 조잡한 예시를 보여주겠다. 정말 조잡하다. 하지만 실전에서는 아래와 같이 사용했다. 위에 방법은 기본적인 코드만을 짰기 때문에 나온 것이다... 아래 영상처럼 사용할 수도 있겠다. 헤헤 내가 만들었다. 물론 Gif를 사용하는 패키지를 포함시킨 거라 중간중간 Duration을 삽입하는 애를 많이 먹었다. 그렇다면 코드를 보자 사용법 우선 dart파일 두 가지를 준비한다. main.dart이다. import 'package:flutter/material.dart'; import 'an..
참으로 오랜만에 글을 쓴다. 오랜만에 글을 쓴다는 말도 자주 사용하는 말이다. TIL은 매일매일 써줘야 하는데 최근에 회사 업무에 집중한 나머지.. 역시나 아직 나는 부족한가 보다. 오늘은 flutter에서 외부 음악(유튜브 음악, 멜론 음악)이 재생될 때, 앱 내에서의 재생(음성, 음악)을 실행하면, 외부음악이 잠시 꺼지고, 앱 내의 음악이나 음성을 모두 다 재생하고 끝냈을 때, 외부 음악이 다시 켜지는 이 복잡한 과정을 컨트롤할 수 있는 패키지를 소개하겠다. 첫 번째 패키지는 https://pub.dev/packages/audio_session audio_session | Flutter Package Sets the iOS audio session category and Android audio at..