tekken5953의 등록된 링크

 tekken5953로 등록된 티스토리 포스트 수는 56건입니다.

[안드로이드] 웹뷰(WebView)(4) - 쿠키&세션 알아보기 [내부링크]

안녕하세요. 이번 포스팅은 웹뷰 시리즈 4번째인 웹뷰에서 쿠키 사용해보기 입니다. 지난 시리즈 동안 웹뷰를 직접 만들어보기도 하고, 생성 및 소멸 단계에 대해 알아보기도 하고, 캐시에 대한 개념도 공부해 보았는데요. 이번엔 웹 페이지에 데이터를 저장하고 불러오는 쿠키에 대해 학습해보겠습니다. 지난 포스팅이 궁금하신 분들은 아래 링크를 참고해주세요! 2022.12.26 - [Android] - [안드로이드] 웹뷰(WebView)(1) - 앱 브라우저에서 호출 2023.01.03 - [Android] - [안드로이드] 웹뷰(WebView)(2) - 접근과 제어 2023.09.04 - [Android] - [안드로이드] 웹뷰(WebView)(3) - 브라우저 캐시 사용하기 쿠키란? 쿠키(Cookie)는 웹페이..

[안드로이드] 에러 'file found with path 'META-INF/DEPENDENCIES'. Adding a packagingOptions block may help, please refer to...' [내부링크]

에러 내용 빌드를 진행하던 도중 아래와 같은 내용의 에러가 발생하면서 빌드가 캔슬 됨. 2 files found with path 'META-INF/DEPENDENCIES'. Adding a packagingOptions block may help, please refer to https://developer.android.com/reference/tools/gradle-api/7.3/com/android/build/api/dsl/ResourcesPackagingOptions for more information 에러 원인 프로젝트 gradle에 implement 되어있는 외부 라이브러리들의 버전이 변경 혹은 추가 되면서 기존에 존재하던 Meta 파일과 캐시가 중복되는 현상이 발생했기 때문. 해결 방법 ..

[안드로이드] Room Primary Key 자동 생성 하는 방법 [내부링크]

코틀린에서 Room을 사용할 때 PrimaryKey로 설정한 Id를 자동으로 생성하고 1씩 증가시키는 방법에 대해 알아보겠습니다. @Entity data class MusicEntity( var id: Long, val data1: String, val data2: String, val data3: Int ) 위의 엔티티 구조로 데이터 클래스를 생성하면 테이블의 필드 값을 입력할 때 id를 직접 선언해주지 않으면 에러가 납니다. 아래와 같이 Long 데이터 타입의 Id를 PrimaryKey로 생성하고 Room 라이브러리의 autoGenerate = true 옵션을 적용시켜주면, Insert 과정에서 id를 직접 입력해주지 않아도 자동으로 생성되며 index를 값으로 가집니다. @Entity data cl..

[백준] 약수(1037번) - 코틀린 풀이 [내부링크]

백준 알고리즘 - 코틀린 풀이 https://www.acmicpc.net/problem/1037 1037번: 약수 첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되 www.acmicpc.net 문제 정답 fun main() { val n = readln().toInt() val input = readln().split(" ").map{it.toInt()} println(input.max() * input.min()) } 풀이 1037번 문제는 입력으로 주어진 가장 작은 약수와 가장 큰 약수의 곱으로 출력을 구하는 문제입니다. 약수들의 곱은 곱한 수보..

[안드로이드] 가로모드 대응하기(Kotlin) [내부링크]

안녕하세요. 이번 포스팅에선 가로모드에서의 레이아웃을 구현하고 적용시키는 방법에 대해 알아보겠습니다. 진행 순서는 아래와 같습니다. TODO List 1. 가로모드(landscape) 레이아웃 생성하기 2. 가로모드로 전환하기 - 대응 방식 3. 가로모드로 전환하기 - 고정 방식 개요 보통 레이아웃을 디자인 할 때 세로로된 화면만을 디자인하게 됩니다. 그렇게되면 사용자가 화면을 회전하였을 경우 세로와 가로의 비율이 반전되기 때문에 뷰가 사라져 보이거나 아래와 같이 겹쳐 보일 수 있죠. 또한, 대시보드나 동영상 플레이어 같은 앱을 구현할 땐 가로모드를 필수적으로 사용하는 경우도 있기 때문에 구현 방법에 대해 알아보겠습니다. 구현 가로모드 레이아웃 생성하기 activity_main.xml 의 가로모드 레이아..

[백준] 삼각형과 세변(5073번) - 코틀린 풀이 [내부링크]

백준 알고리즘 - 코틀린 풀이 https://www.acmicpc.net/problem/5073 5073번: 삼각형과 세 변 각 입력에 맞는 결과 (Equilateral, Isosceles, Scalene, Invalid) 를 출력하시오. www.acmicpc.net 문제 정답 fun main() { while(true) { val input = readln().split(" ").map{it.toInt()}.sorted() if (input.count{it == 0} == 3) { break } else { if (input[2] >= input[0] + input[1]) { println("Invalid") } else { when(input.count { it == input[1] }) { 3 ->..

[백준] 제로(10773번) - 코틀린 풀이 [내부링크]

백준 알고리즘 - 코틀린 풀이 https://www.acmicpc.net/problem/10773 10773번: 제로 첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경 www.acmicpc.net 문제 정답 import java.io.BufferedReader import java.io.InputStreamReader fun main(): Unit = with(BufferedReader(InputStreamReader(System.`in`))) { val input = readLine().toInt() val array = A..

[백준] 숫자 카드2(10816번) - 코틀린 풀이 [내부링크]

백준 알고리즘 - 코틀린 풀이 https://www.acmicpc.net/problem/10816 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,0 www.acmicpc.net 문제 정답 import java.io.BufferedReader import java.io.BufferedWriter import java.io.InputStreamReader import java.io.OutputStreamWriter fun main() = with(BufferedReader(InputStreamReader(Sy..

[백준] 회사에 있는 사람(7785번) - 코틀린 풀이 [내부링크]

백준 알고리즘 - 코틀린 풀이 https://www.acmicpc.net/problem/7785 7785번: 회사에 있는 사람 첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는 www.acmicpc.net 문제 정답 fun main() = with(System.`in`.bufferedReader()) { val n = readLine().toInt() val hashSet = HashSet() repeat(n) { val (name, move) = readLine().split(" ") if (hashSet.add(name)) {..

[백준 알고리즘] 수학은 비대면(19532번) - 코틀린 풀이 [내부링크]

백준 알고리즘 - 코틀린 풀이 https://www.acmicpc.net/problem/19532 문제 정답 import java.util.* fun main() = with(Scanner(System.`in`)){ val a = nextInt() val b = nextInt() val c = nextInt() val d = nextInt() val e = nextInt() val f = nextInt() for(x in -999 until(1000)) { for(y in -999 until(1000)) { if (a*x + b*y == c && d*x + e*y == f) { println("$x $y") break } } } } 풀이 19532번 문제는 2차 방정식의 x,y값을 구하는 문제입니다. 2..

[백준 알고리즘] 행렬 덧셈(2738번) - 코틀린 풀이 [내부링크]

백준 알고리즘 - 코틀린 풀이 https://www.acmicpc.net/problem/2738 2738번: 행렬 덧셈 첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같 www.acmicpc.net 문제 정답 import java.lang.StringBuilder import java.util.* fun main() = with(Scanner(System.`in`)){ val N = nextInt() val M = nextInt() val array = Array(N) { IntArray(M) } val sb = StringBuilder() for..

[백준 알고리즘] 대지(9063번) - 코틀린 풀이 [내부링크]

백준 알고리즘 - 코틀린 풀이 https://www.acmicpc.net/problem/9063 9063번: 대지 첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다. 각각의 좌표는 -10,000 이상 10,000 이하의 정수이다. www.acmicpc.net 문제 정답 import java.util.* fun main() = with(Scanner(System.`in`)){ val num = nextInt() var minX = Int.MAX_VALUE var minY = Int.MAX_VALUE var maxX = Int.MIN_VALUE var maxY = Int.MIN_VALUE for(i in 0 ..

[백준 알고리즘] 약수 구하기(2501번) - 코틀린 풀이 [내부링크]

백준 알고리즘 - 코틀린 풀이 https://www.acmicpc.net/problem/2501 2501번: 약수 구하기 첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다. www.acmicpc.net 문제 정답 import java.util.* fun main() { val sc = Scanner(System.`in`) val N = sc.nextInt() val K = sc.nextInt() val array = ArrayList() for(i in 1.. N) { if (N % i == 0) { array.add(i) } } if (array.size >= K) { println(array[K-1]) } else { println("..

[백준 알고리즘] 소수(2581번) - 코틀린 풀이 [내부링크]

백준 알고리즘 - 코틀린 풀이 https://www.acmicpc.net/problem/2581 2581번: 소수 M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다. www.acmicpc.net 문제 정답 import java.util.* fun main() { val sc = Scanner(System.`in`) val n = sc.nextInt() val m = sc.nextInt() var min = m var sum = 0 var count = 0 for (i in n..m) { if (calcDivisor(i)) { count++ sum += i if (i <..

[안드로이드] 앱 백그라운드 전환 감지하기 - 코틀린&자바 [내부링크]

안녕하세요. 이번 포스팅에서는 앱이 백그라운드로 전환되고, 다시 포그라운드로 돌아오는 이벤트를 감지하는 기능에 대해 알아보겠습니다. 간단하게 설명드리면 LifecycleEventObserver와 Application을 implement 하여 생명주기에 발생에 따라 이벤트를 감지하여 처리하는 구조입니다. 간단한 예제와 함께 설명드리겠습니다. 결과 GIF 아래와 같이 백그라운드로 전환 후 다시 돌아오는 이벤트를 반복하여 확인했습니다. 결과 로그 최초 포그라운드로 접근시 찍히는 로그입니다. 백그라운드로 전환될 때 찍히는 로그입니다. 다시 포그라운드로 전환될 때 찍히는 로그입니다. 본문 위의 로그에서 보이듯 targetState와 event의 Lifecycle이 다릅니다. targetState는 LifeCyc..

[Kotlin& Java] 체감온도 구하기(기상청 기준) [내부링크]

안녕하세요. 기상청에서 제공하는 체감온도 계산 방식을 코틀린과 자바로 작성한 코드를 공유 드립니다. 계산 방식은 아래와 같으며, 산출식이 여름과 겨울에 따라 다릅니다. 10분 평균 풍속인 w는 그냥 현재 풍속을 사용하셔도 무방합니다. 그리고 겨울철 체감온도를 계산하는 조건인 기온10 이하, 풍속 1.3m/s 이상은 코드에 반영시키지 않았으니, 실제 데이터를 불러오는 로직에서 조건 처리를 해주시면 될 것 같습니다. 전체 코드 getSensibleTemp(...) 메서드를 호출하여 사용하시면 됩니다. return type은 double입니다. import java.time.LocalDateTime; import java.lang.Math; public class Temp { /** * 여름철 체감온도 (5..

[백준 알고리즘] 너의 평점은(25206번) - 코틀린 풀이 [내부링크]

백준 알고리즘 너의 평점은 25206번- 코틀린 풀이 https://www.acmicpc.net/problem/25206 25206번: 너의 평점은 인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다! 치 www.acmicpc.net 문제 정답 import java.util.*; fun main() { val sc = Scanner(System.`in`) var sum = 0.0 var sumScore = 0.0 for(i in 0..19) { val subject = sc.next() val score = sc.nextDouble() val grade = sc.next() va..

[백준 알고리즘] 공 넣기(10810번) - 코틀린 풀이 [내부링크]

백준 알고리즘 공 넣기 10810 - 코틀린 풀이 https://www.acmicpc.net/problem/10810 10810번: 공 넣기 도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이 www.acmicpc.net 문제 정답 import java.lang.StringBuilder import java.util.* fun main() { val sc = Scanner(System.`in`) val N = sc.nextInt() val M = sc.nextInt() val arrayN = IntArray(N) val result = StringBuilder()..

[백준 알고리즘] 오븐시계(2525번) - 코틀린 풀이 [내부링크]

백준 알고리즘 2525 - 코틀린 풀이 https://www.acmicpc.net/problem/2525 2525번: 오븐 시계 첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.) www.acmicpc.net 문제 전체 코드 import java.util.* fun main() { val sc = Scanner(System.`in`) val A = sc.nextInt() val B = sc.nextInt() val C = sc.nextInt() val sum = 60 * A + B + C// A와 B를 분으로 변환한 것에 C를 더함 var hours ..

[안드로이드] 코틀린 typealias에 대해 알아보기 [내부링크]

안녕하세요. 이번 포스팅에서는 코틀린의 typealias에 대해 알아보겠습니다. 코틀린의 typealias 키워드를 직역해보면 입니다. 말 그대로 타입(유형)에 별명을 지어주는 것인데요. 공식문서를 참고하거나 Kotlin Weekly를 참고해보면, typealias는 타입의 이름이 너무 길거나 중복되는 경우 좀 더 읽기 쉬운 이름으로 변경하기 위해 사용한다고 합니다. 예를 들어, 아래와 같이 변수를 생성한다고 한다고 할 때..벌써부터 머리가 어지럽습니다. var type: LiveData 만약 변수가 아니라 함수나 데이터 클래스에 중복되어서 들어간다고하면 정신이 혼미해지죠 data class Type(val name: LiveData, val value: LiveData) 그 때, 우리는 제너릭 타입의 ..

[안드로이드] @JvmStatic의 역할은? + 확장 함수의 개념 [내부링크]

안녕하세요. 이번 포스팅에서는 JvmStatic이라는 어노테이션이 하는 역할에 대해서 알아보겠습니다. 간단한 예제로 결과와 함께 설명드리겠습니다. 결론 JvmStatic 어노테이션은 자바 파일에서 코틀린의 함수나 메서드를 정적(static) 멤버 처럼 사용하기 위해 존재합니다. 개요 확장함수 JvmStatic은 주로 코틀린에서 사용합니다. 위의 결론을 풀어서 설명드리면 한 프로젝트안에 코틀린 파일과 자바 파일이 공존한다고 할 때, 자바 파일에서는 함수의 멤버에 접근하기 위해 함수에게 인자를 전달하는 과정이 필요합니다. 예를들어 자바에서 객체에 접근할때 일반적으로 아래와 같이 클래스에 접근해 객체의 인자를 가져옵니다. KotlinClass kotlinClass = new KotlinClass(); kotl..

[안드로이드] 웹뷰(WebView)(3) - 브라우저 캐시 사용하기 [내부링크]

안녕하세요. 이번 포스팅에서는 웹 자바스크립트에서 설정한 캐시를 사용하여 웹페이지를 로드하는 방법에 대해 알아보겠습니다. 실제로 안드로이드에서 캐시를 통한 웹 로드인지 네트워크를 통한 웹 로드인지 구분하는 메서드는 없는 것으로 알고있기 때문에 사용하는 방법에 대한 설명만 드리고 마무리하는 것으로 하겠습니다. 웹뷰에 대한 생성 및 제어에 관련된 포스팅은 아래에 있습니다. 2022.12.26 - [Android] - [안드로이드] 웹뷰(WebView)(1) - 앱 브라우저에서 호출 2023.01.03 - [Android] - [안드로이드] 웹뷰(WebView)(2) - 접근과 제어 개요 우리가 웹페이지를 브라우저에서 로드할때 리소스가 큰 이미지 파일이나 많은 양의 뷰를 불러오는 것은 페이지 로드시간의 지연에..

[안드로이드] 단축키를 커스텀하여 개발속도 향상시키기 [내부링크]

안녕하세요. 이번 포스팅에서는 안드로이드 스튜디오에서 자주쓰는 IDE 기능들의 단축키를 설정하여 개발 속도를 향상시키는 방법에 대해 소개드리려고 합니다. 자주 사용하는 기능들을 마우스 없이 한번의 키 입력으로 사용할 수 있다는건 개발자에게 있어서 생각 이상의 유용함이죠. 간단하지만 방법을 몰라서 사용하지 못하시는 분들도 많고, 크게 중요하지 않다고 생각해서 사용하지 않으시는 분들도 많아서 몇가지 추천드리려고 합니다. 방법은 생각보다 간단합니다. 단축키 변경 먼저 File > Settings에 들어갑니다. 검색창에 Keymap 이라고 입력하시면 안드로이드 스튜디오의 모든 기능들이 나열되어있습니다. 여기서 파란색으로 표시되는 항목들이 커스텀으로 재설정한 기능들이 포함되어 있는 항목입니다. 하위 경로로 들어가..

[안드로이드] 눌러서 공유하기 구현 [내부링크]

안녕하세요. 이번 글에선 공유하기 버튼을 클릭하면 해당 URL 혹은 데이터를 공유하는 방법에 대해 알아보겠습니다. 예제는 아래 개요의 순서대로 진행되며, 코드는 코틀린으로 작성되었습니다. 결과 개요 진행 순서는 아래와 같습니다. 1. 공유하기 버튼 생성 2. 인텐트 타입 및 타이틀 지정 3. 공유 할 데이터 지정 4. chooser로 사용자가 공유할 환경 선택 구현 공유하기 버튼 생성 저는 기본 버튼을 생성하여 공유하기 기능을 넣겠습니다. 용도에 맞게 아이콘이나 텍스트를 넣어서 사용하시면 되겠습니다. 인텐트 타입 및 타이틀 지정 버튼을 바인딩하고 클릭 이벤트에 공유하기를 진행 할 Intent를 생성해줍니다. ACTION_SEND_MULTIPLE 플래그로 공유 기능을 가진 인텐트를 생성하였고, 인텐트의 ..

[안드로이드] Kotlin 커스텀 뷰 생성하기 [내부링크]

안녕하세요. 이번 포스팅에서는 같은 디자인 및 속성을 공유하는 커스텀 뷰를 생성하고 적용하는 방법에 대해 알아보겠습니다. 아래 사진은 버튼 3개에 커스텀 뷰를 적용한 화면입니다. 개요 프로젝트를 진행하면서 비슷한 기능에 비슷한 디자인의 뷰를 여러개 생성해야 하는 경우가 흔하게 발생합니다. 만약 뷰의 개수가 적다면 다행이지만 공통된 여러개의 뷰가 하나의 레이아웃을 이루고 있다면 골칫거리가 아닐 수 없죠. 그때 우리는 커스텀 뷰로 하나의 뷰 처럼 만들 수 있습니다. 아래 방식에 따라 예제를 진행하고 결과를 확인해 보겠습니다. 1. 커스텀 속성 파일 생성 및 정의 2. 커스텀 뷰 레이아웃 파일 생성 3. 커스텀 뷰 클래스 파일 생성 4. 메인 레이아웃 파일에 커스텀 뷰로 공통된 뷰 생성 본문 커스텀 속성 파일..

[안드로이드] 앱 테마 모드 변경하기 [내부링크]

안녕하세요. 이번 포스팅에서는 앱의 테마 설정을 클래스에서 변경하는 방법에 대해 알아보겠습니다. 아래 예제는 코틀린으로 작성되었습니다. 개요 앱 테마를 시스템 테마로 설정하여 사용자의 기기에 동기화 시키는 방법도 있지만, 앱의 설정 페이지에 테마를 변경하는 기능을 추가하여 해당 앱에서 사용하는 테마를 정해 줄수도 있습니다. 이번 글에서 이벤트에 따라 테마를 변경하는 방법에 대해 소개드리겠습니다. 본문 예제 진행 순서 메인 레이아웃 구성 (테마 변경 버튼 3개 + 테마 변경을 확인 할 텍스트 뷰 1개) 뷰의 속성에 적용할 테마 별 옵션 생성 테마를 변경하는 함수 구현 각 버튼에 테마 변경 함수를 적용 결과 확인 메인 레이아웃 구성 버튼은 라이트 모드, 다크 모드, 시스템 모드 총 3가지로 구성되어 있습니다..

[안드로이드] 로그 색상과 길이 변경으로 가시성 올리기 [내부링크]

안녕하세요. 이번 포스팅에서 안드로이드 스튜디오에서 로그의 색상을 변경하는 방법과 길이를 간소화 하는 방법에 대해 알아보려고 합니다. 출력되는 로그에 대한 정보는 이전 포스팅인 Logger 라이브러리에서 사용했던 코드를 재사용 하였습니다. 로그 색상 변경 경로 : File > Setting > Editor > Color Scheme > Android Logcat 변경을 원하는 IDE 테마를 선택하고 각각의 항목들에 해당하는 색상을 입력하여 주시면 됩니다. ① IDE 테마 선택 : 테마마다 다른 로그의 색상을 적용 할 수 있습니다. ② 로그 종류 선택 : 변경을 원하는 로그의 태그를 선택합니다. ③ 변경 내용 선택 : 변경 할 종류를 선택하고 내용을 입력합니다. ※ 변경 내용에 대한 설명입니다. Foreg..

[안드로이드] Logger - 간단하고 예쁜 로그 출력 [내부링크]

안녕하세요. 이번 포스팅에서는 안드로이드 로그를 가시성이 높고 예쁘게 출력하는 방법에 대해서 알아보겠습니다. 로그 출력 결과는 아래 사진과 같습니다. 개요 프로그램을 개발하다 보면 내가 원하는 결과를 로그캣에 담아서 확인해야 하는 일이 매우 빈번하게 발생합니다. 그때 우리는 보통 안드로이드 기본 라이브리러인 Log를 사용합니다. 보통 이런 식으로 쓰시는 경우가 많습니다. Log.d("TAG_LOG", "기본 로그 라이브러리") 결과물은 아래와 같습니다. 하지만 이런 로그가 여러개가 반복되고 여러개의 태그를 동시에 봐야하는 일이 발생한다면 가시성이 떨어지기 십상이죠. 그래서 이번에 소개드릴 제품은라이브러리는 Logger입니다. Logger는 orhanobut이 개발한 라이브러리로, 기본 로그를 좀 더 보기..

[안드로이드] 중복 클릭 방지하는 방법 [내부링크]

안녕하세요. 이번 포스팅에선 뷰의 클릭 이벤트가 여러번 중복 발생해서 생기는 에러들을 해결하기 위한 방법을 소개드리려고 합니다. 방식은 뷰의 클릭 리스너를 상속받는 클래스를 생성하고, 클릭 이벤트가 발생했을 때의 시간과 현재 시간을 비교하여 일정시간이 지나기 전까지 클릭을 막는 형태입니다. 전체 예제 코드를 보여드린 후 설명드리겠습니다 시연 저는 버튼 하나와 텍스트뷰 하나를 생성해 버튼을 클릭하면 텍스트의 숫자가 하나씩 증가하는 예제를 만들었습니다. 아래 코드와 같이 중복 클릭 방지시간은 1초로 설정하였고, 중복클릭이 발생했을 경우엔 아무런 처리를 하지 않았습니다. 코드 import android.os.SystemClock import android.view.View import android.wid..

[컨퍼런스 후기] Google I/O Extended 2023 Seoul 후기 [내부링크]

안녕하세요c 대략 한달만에 글을 남기는 것 같습니다. 요새 장마가 끝이나고 정말 숨이 턱턱 막히는 날씨들이 반복되고 있는데 다들 건강관리 잘 하시고 계신지 궁금하네요 ㅎㅎ 저는 요새 새로운 서비스 배포일에 가까워 지다보니 할 일도 많아지고 이것 저것 신경쓸 것도 늘어나는 것 같습니다.. 그래도 이번에 시간이 생겨 2023.07.29에 개최 된 Google I/O Extended 2023 Seoul에 다녀왔는데요! 역시 국내 최대규모의 컨퍼런스라 그런지 사람이 정말 많았던 것 같습니다. (다들 이런 무더운 날씨인 주말에 오시다니 열정이 대단하신...주말에...주말..에...) 사실 저는 저번에 다녀온 AI 컨퍼런스(MatLab Expo)보다 제가 지금 사용하고 있는 분야의 발표를 들을 수 있는 행사라 더..

[안드로이드] 시간 객체 LocalDataTime ↔ Long 파싱하기 [내부링크]

안녕하세요. 이번 포스팅에서는 날짜 객체인 LocalDataTime과 TimeStamp 객체인 Long을 서로 파싱하는 방법에 대해 알아보겠습니다. 개요 보통 안드로이드에서 System.currentTimeMillis(), Date 객체의 매개변수, Calendar 객체의 timeInMillis() 등 자주 사용하는 데이터 타입들은 Long 타입으로 제공됩니다. 하지만 Long은 타임스탬프이기 때문에 실제 날짜나 시간 데이터와는 형태가 다릅니다. 따라서 우리가 사용하기 좋은 구조로 데이터를 파싱하는 과정이 필요한데, 이때 자주 사용되는 객체가 LocalDateTime입니다. LocalDateTime은 시간을 년,월,일,시,분,초 등으로 쪼개어 받아올 수 있고, 세계시간을 기준으로 해당하는 지역의 시간으로..

[컨퍼런스 후기] 2023 MatLab Expo Korea 뒷북 후기c [내부링크]

안녕하세요:) 오늘은 2023년 5월 24일에 3년만에 개최된 MathWorks 주최 MatLab Expo Korea에 다녀온후기에 대해 적어보려고합니다! 예.. 이건 뒷북을 넘어서 징,장구,꾕가리가 함께 어우러진 뒷풍물놀이급 리뷰입니다..ㅠㅠ 그 동안 바쁘기도 하였고 리뷰를 써야할지 말아야할지에 대한 고민도 깊었기 때문에늦어져 버렸습니다. 고민이 깊었던 이유는 저는 개발자이긴 하지만 인공지능과는 전혀 연이 없던 사람이기 때문입니다. (순전히 제 문제죠.) 그러다보니 컨퍼런스에 대한 이야기를 늘어놓아도 전문가분들에게 도움이 전혀 되지 않는것이 당연하였고 실제로 보고 느낀것들은 있었지만 전달력이 떨어질 것 같다고 생각했죠. 그래서! 이번 글에서는 MatLab Expo에 대한 간단한 소개와 실제 컨퍼런스..

[안드로이드] EditText 입력 키패드(키보드) 올리기 및 내리기 [내부링크]

안녕하세요. 이번 포스팅에서는 EditText를 클릭 하였을 때 자동으로 보여지는 입력 키패드를 수동으로 컨트롤하는 예제를 진행해보겠습니다. 결과 GIF 먼저, 결과 화면을 보시겠습니다. 아래 GIF 처럼 특정 이벤트가 발생하였을 때 EditText에 포커스를 주고 키보드를 올리고 내리는 방식으로 구현 할 수 있습니다. 전체코드 레이아웃 파일엔 EditText와 키패드를 올리는 버튼, 내리는 버튼을 각각 1개씩 생성하였습니다. KeyboardController.kt object KeyboardController { // 키보드 올리기 fun upKeyboard(context: Context, et: EditText) { val inputMethodManager = context.getSystemServi..

[안드로이드] 에러 'Cannot invoke setValue on a background thread' 해결 [내부링크]

java.lang.IllegalStateException: Cannot invoke setValue on a background thread 해당 에러는 라이브데이터를 사용할 때 MutableLiveData 타입의 변수에 값을 넣는 과정에서 주로 발생합니다. Livedata 객체에 값을 넣는 방식은 setValue와 postValue 두가지가 존재합니다. setValue는 메인 스레드에서 직접 값을 할당하는 방식이고, 반대로 postValue는 백그라운드에서 값을 할당하는 방식입니다. 만약 위 에러가 발생했다면 setValue를 백그라운드 스레드에서 사용하고 있진 않은지 확인하기 바랍니다. postValue와 setValue의 사용방법을 간단하게 보여드리고 글을 마무리하겠습니다. setValue muta..

[안드로이드] GPS 위치 정보 접근 권한 확인하기! [내부링크]

안녕하세요. 이번 글을 쓰게 된 이유는 예전에 같이 알아보았던 디바이스 GPS 센서를 활용한 데이터를 다루는 글의 추가적인 정보를 전달드리기 위해서입니다. 예전 글에선 Google Location Service를 사용하여 현재 디바이스의 위치정보와 그 위치정보를 주소로 변환하는 과정까지 진행해 보았었습니다. 이번엔 좀 더 디테일한 처리를 위해 실제 사용자가 위치정보를 불러올 수 있는 환경인가? 를 검사하여 정상적으로 불러올 수 있는 환경일 경우에만 불러오는 처리를 간단하게 해 보겠습니다. 이번글에 위치를 불러오는 코드는 생략되었으니 혹시나 현재 위·경도 정보나 주소정보를 불러오는 글이 궁금하시면 아래 링크를 달아놓겠습니다. https://tekken5953.tistory.com/17 [안드로이드] 내 G..

[안드로이드] Toast 메시지 누를때마다 갱신시키기 [내부링크]

안녕하세요. 이번 포스팅에는 안드로이드 개발에서 자주 사용하는 토스트 메시지를 즉시 생성(갱신)하는 방식에 대해 알아보겠습니다. 개요 토스트메시지는 일반적으로 정해진 Duration(지속시간)이 지속될 때 까지 다른 토스트 메시지들의 접근을 Blocking합니다. 왜냐하면 같은 스레드를 동기방식으로 사용하기 때문이죠. 그래서 만약 사용자가 토스트 메시지를 짧은시간에 여러번 호출한다면 아래 GIF와 같이 본인만의 시간의 흐름을 가지기 시작하며, 이는 사용자로 하여금 반응이 느리고 렉이 걸리는 듯한 오해를 가지게하기 쉽습니다. ※ 메시지가 서로 다름을 쉽게 확인하기위해 1씩 증가하는 카운트를 붙였습니다. 그럼 누르는 즉시 토스트 메시지로 띄워 주려면 어떻게 해야할까요? 저는 버튼이 클릭 될 때마다 새로운 스..

[안드로이드] 뷰에 샘플 데이터 넣기 [내부링크]

안녕하세요. 이번 포스팅에선 레이아웃파일(.xml)에서 텍스트 혹은 이미지에 프리뷰 용 샘플 데이터를 넣는 방법에 대해 알아보겠습니다. 사용목적 보통 리사이클러뷰나 리스트뷰 처럼 리스트 아이템에 해당하는 레이아웃을 따로 만들고 뷰에 적용하는 방식의 구성을 사용할 때, 실제 데이터가 정해지지 않은 상황에서 틀만 만들어야 하는 경우가 간혹 있죠. 그럴때 안드로이드에서 제공하는 샘플 데이터를 이용하여 데이터가 들어갔을 경우 어떤방식으로 뷰가 보여질지 확인할 수 있습니다. 사용방식 그냥 단순 텍스트나 이미지 단일 뷰에 적용 할 수도있지만 저는 사용성이 더 높은 리사이클러뷰의 아이템에 적용하였습니다. 먼저, 액티비티 레이아웃에 리사이클러뷰를 생성해줍니다. 그 다음 리스트 아이템 레이아웃파일을 생성 한 후에 원하는..

[안드로이드] 배터리 잔량 + 충전상태 불러오기 - BatteryManager [내부링크]

안녕하세요. 이번 포스팅에서는 디바이스의 충전케이블 연결 여부와 배터리 잔량을 불러오는 기능에 대해 같이 알아보겠습니다. 진행 순서는 아래와 같습니다. 참고로 BatteryManager를 제외한 추가적인 학습이 필요한 기능의 사용을 최대한 지양하며 작성했습니다. 1. 배터리의 상태를 표시하는 레이아웃 생성 2. 암시적 인텐트로 BroadCast Receiver 호출 3. 뷰를 실시간으로 업데이트 하기 위한 BroadCast Receiver 생성 4. Manifest 파일에 BroadCast Receiver 등록하기 결과 GIF 배터리의 상태를 표시하는 레이아웃 생성 배터리의 상태에 따라 변화하는 ImageView와 TextView, 잔량을 표시할 TextView를 생성하였습니다. 배터리 상태는 1~6단계..

[안드로이드] 텍스트 폰트 적용하기(Kotlin,Java,XML) [내부링크]

안녕하세요. 이번 포스팅에선 문자열에 폰트를 적용하는 방법에 대해 알아보겠습니다. 1. XML 레이아웃 파일에서 적용하기 2. Java and Kotlin 파일에서 적용하기 XML 레이아웃 파일에서 적용하기 Setting 먼저 프로젝트 res 폴더에 font 패키지를 추가하고 폰트 ttf 혹은 otf파일을 넣어줍니다. res 폴더 우클릭 > New > Android Resource Directory > Resource type: font > 폰트파일 복사/붙여넣기 activity_main.xml android:fontFamily="@font/폰트명" Java and Kotlin 파일에서 적용하기 Setting 클래스파일에서 폰트를 변경하기 위해 Assets 폴더를 생성합니다. app 폴더 우클릭 > Ne..

[안드로이드] 내 GPS 위치정보 + 상세주소 불러오기 - Google's Location Service [내부링크]

안녕하세요. 이번 포스팅에서는 스마트폰에 내장된 GPS 센서가 측정한 데이터를 불러오고, 상세 데이터로 변환하는 예제를 진행 해보겠습니다. 특정 기술에 대한 이해가 목적이므로 추가적인 학습이 필요한 기술의 사용은 최대한 지양하였습니다. 그럼 같이 알아보겠습니다! 개요 이번 예제에서는 Google Location Service 라이브러리의 Location과 GeoCoder를 사용하여 아래의 순서로 위치 정보를 불러오는 절차를 진행해보겠습니다. 1. 현재 GPS 위치정보 불러오기 2. 불러온 위치정보를 바탕으로 추가적인 주소정보 불러오기 3. 임의의 위치와 지금 내 위치와의 거리 구하기 본론 라이브러리 추가 항상 그렇듯 라이브러리는 최신버전의 태그를 사용해주시면 됩니다. 저는 21.0.1 버전을 사용하였습니..

[안드로이드] 안드로이드 스튜디오 버전 다운그레이드 하기! [내부링크]

안녕하세요.이번 포스팅에선 안드로이드 스튜디오의 버전을 최신버전이 아닌 이전버전으로 변경하는 방법에 대해 알아보겠습니다. 설치방법에 관한 내용은 2번 설치과정 항목에 있습니다. 문제발생 최근에 진행하던 프로젝트를 안드로이드 13 버전 ( = SDK Version 33 = Code TIRAMISU)으로 올리면서 위와 같은 문제가 발생하였습니다. 해당 문제는 위 사진의 옵션에서만 해당되는 것이 아니라 곳곳에서 발견되었죠. 열심히 찾아본 결과 현재 제가 사용하는 안드로이드 스튜디오의 버전이 SDK 33 버전을 호환하지 못해서 발생하는 문제라는 것을 알아냈습니다. 제가 원래 쓰고있던 버전은 ChipMunk Patch 2 버전이었는데요.(틀...) 최신버전인 Electric Eel 버전이 정상적으로 다운로드 되..

안드로이드에서 Firebase Realtime DB 사용하기 [내부링크]

데이터의 저장 보통 우리는 어떠한 값을 저장할 때 데이터 저장소인 DB를 이용합니다. 저장 하려는 데이터가 원시 데이터일 경우 안드로이드 SharedPreference API를 이용하기도 하고, 외부통신 없이 빠르게 로컬환경에서 데이터를 불러오기 위해 SQLite나 Room을 이용하기도 하죠. 또한 데이터의 양이 많아지고, 공유하는 환경이 늘어난다면 서버에 연결된 외부 DB에 요청을 보냅니다. 관계형 데이터베이스(RDB)와 비관계형 데이터베이스(No SQL) 일반적인 DB구조에서 관계형 데이터베이스(RDB)는 스키마와 스키마를 요구하는 테이블의 구조를 따릅니다. 따라서 흔히 CRUD라고 부르는 데이터 조작어를 기본 명령어로 가집니다. 반대로 비관계형 데이터베이스(No SQL)는 테이블 구조에서 벗어난 비..

[안드로이드] Transition - 자연스러운 화면 연결 애니메이션 [내부링크]

안녕하세요. 이번 포스팅에서는 액티비티를 전환할 때 뷰의 이동 애니메이션을 부여하는 기능에 대해 알아보겠습니다. AnimationOptions의 하위 메서드인 makeSceneTransitionAnimation은 Transition이 발생할 때 전환 할 액티비티와 전환 되어질 액티비티에서 두 View를 연결하여 Animation을 지정해 주는 기능입니다. 먼저 실행화면부터 보시겠습니다. 코드 진행순서는 이렇습니다. 1. startActivity와 endActivity를 생성하고 레이아웃을 구성 2. transitionName을 동일하게 입력 3. ActivityOptions.makeSceneTransitionAnimation 메서드를 구현 4. 전환할 액티비티에 intent를 통해 데이터 전달 5. 전환..

[안드로이드] 진동 커스텀하기 - VibratorManager [내부링크]

안녕하세요. 이번 포스팅에서는 특정 이벤트가 발생한 것을 사용자에게 인지시켜주는 방법 중 하나인 진동을 구현해보도록 하겠습니다. 아래의 TODO TASK의 순서대로 진행하는 예제입니다. TODO TASK 1. 진동을 사용하기 위한 권한 추가 2. VibratorManager를 이용한 진동발생 클래스 구현 3. 버튼을 클릭하였을 때 SnackBar와 함께 진동 구현 4. 진동 List를 만들어 여러번 울리는 진동 구현 5. Coroutine으로 비동기 처리 본문 진동을 사용하기 위한 권한 추가 VibratorManager를 이용한 진동발생 클래스 구현 안드로이드 SDK 버전 31부터 VIBRATOR_SERVICE가 deprecated 되어 버전별 대응을 해줍니다. import android.content..

[안드로이드] 앱 강제 재시작하는 방법! [내부링크]

안녕하세요. 이번 포스팅에서는 현재 컨텍스트에서 앱을 재시작하는 방법에 대해 알아보겠습니다. 보통 데이터베이스를 롤백시키거나 언어설정을 변경하는 등 어플리케이션의 환경을 변경할 때 앱을 재시작하는 경우가 많습니다. 이럴 때 유용한 코드를 소개드리겠습니다. 원리는 현재 프로세스를 종료시키면서 앱의 패키지 컴포넌트를 Intent의 makeRestartActivityTask 메서드의 파라미터로 호출해 다시 실행시키는 방식입니다. 작성코드 Kotlin private fun restartApplication(mContext: Context) { val packageManager: PackageManager = mContext.packageManager val intent = packageManager.getLa..

[안드로이드] savedInstanceState 는 왜 있는걸까? [내부링크]

안녕하세요. 앱개발을 공부하다 문득 onCreate()의 Parameter로 생성되는 savedInstanceState는 도대체 무슨 역할을 할까? 라는 의문이 들어 찾아보았습니다. 활동 상태 변경 앱의 생명주기(활동 수명주기)를 참고하면, Activity는 앱의 구성이 변경되면 모든 활동이 제거되고 다시 생성됩니다. 그 과정에서 onPause(), onStop() 및 onDestory() 콜벡을 호출하고 인스턴스가 소멸되며, 새 인스턴스가 생성될 때 onCreate(), onStart() 및 onResume() 콜벡을 호출합니다. savedInstanceState 는 화면 구성의 변경이 발생할 때 현재 인스턴스에서 데이터를 저장하고 새 인스턴스에서 다시 불러오기 위해 호출되며, 대표적인 구성의 변경으로..

[안드로이드] 웹뷰(WebView)(2) - 접근과 제어 [내부링크]

안녕하세요. 이전 포스팅에 이어 웹뷰에 대해 계속 알아보겠습니다. 이전엔 웹뷰를 생성하여 페이지를 로드하는 것 까지 해봤다면, 이번 글에서는 앱에서 웹뷰에 접근하고 제어하는 기능에 대해 알아보겠습니다. 응용프로그램 제어(WebViewClient) 페이지의 방문 기록 탐색 구성 변경 처리 기타 제어 웹뷰를 생성하는 부분은 (1)번 포스팅을 참고하시기 바랍니다. 2022.12.26 - [안드로이드 Android] - [Android] 안드로이드 웹뷰(WebView)(1) - 앱 브라우저에서 호출 응용프로그램 제어 웹뷰에서 웹페이지를 호출할 때 웹 페이지에 의존하여 모든 동작과 제어를 맡길 수도 있지만, 앱에서 웹페이지에 접근하고 페이지의 생성소멸 상태를 인지하기 위해서는 WebViewClient의 메서드를 ..

[안드로이드] 에러 'Inconsistency detected. Invalid view holder adapter positionViewHolder' 해결 [내부링크]

아이템을 삭제하고 갱신하는 로직을 구성하는 도중, 리사이클러뷰의 아이템을 삭제하는 뷰모델과 리스트를 불러오는 뷰모델이 충돌하여 해당 에러가 발생하고 말았습니다. 스택 오버플로를 참고하면 서로 다른 스레드에서 돌아가는 뷰모델이 작업을 완료하기 전에 같은 뷰의 제어를 호출해서 오류가 발생한 것으로 보입니다. 스택오버플로 페이지 링크 해결방법은 LayoutManager의 Wrapper를 생성하고 애니메이션을 false로 설정해 주면 해당 에러가 사라지게 됩니다. 이제 적용방법에 대해 알아보겠습니다. 코드 먼저 지정할 레이아웃매니저 클래스를 생성합니다. LinearLayoutManagerWrapper class LinearLayoutManagerWrapper: LinearLayoutManager { constr..

[안드로이드] WifiManager로 연결 가능한 와이파이 검색하기 [내부링크]

안녕하세요. 이번 포스팅에서는 안드로이드의 WifiManager를 이용하여 연결 가능한 와이파이의 목록을 스캔하는 기능을 구현해보겠습니다. 가장 간단하게 목록만 출력하는 예제이니 연결이나 다른 기능들은 사용하지 않았습니다. 작성코드 먼저 AndroidManifest 파일에 권한을 사용하겠다고 명시해줍니다. 권한은 인터넷사용 + 현재위치 + 와이파이 접근 총 5가지입니다. 다음으로 유저에게 민감정보인 위치권한을 직접 요청하는 코드를 작성합니다. private fun requestPermission(activity: Activity) { if(ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_FINE_LOCATIO..

[안드로이드] 웹뷰(WebView)(1) - 앱 브라우저에서 호출 [내부링크]

안녕하세요. 이번 포스팅에서는 웹앱 혹은 하이브리드 앱을 만들 때 사용하는 웹뷰(WebView)를 통해, 웹페이지를 어플리케이션에 보여주는 방법에 대해 알아보겠습니다 웹뷰는 안드로이드 프레임워크 내부 라이브러리로 따로 implementation은 필요하지 않습니다. 인터넷 페이지를 사용하기 때문에 manifest 파일에 인터넷 권한을 요청하는 코드를 넣어주시면 됩니다. 메인 액티비티에서 EditText에 URL을 입력하고, 버튼을 클릭하면 웹뷰 액티비티로 넘어가는 간단한 프로그램입니다. 그럼 코드부터 확인 하시겠습니다. 결과코드 package com.example.webviewexam import android.content.Intent import androidx.appcompat.app.AppC..

[안드로이드] 아래에서 올라오는 다이얼로그 - BottomSheetDialogFragment [내부링크]

안녕하세요. 이번 포스팅에서는 특정 이벤트를 발생시켰을 때 앱 하단에서 커스텀 다이얼로그가 올라오는 기능을 구현해 보도록 하겠습니다. 이번에도 코드부터 보여드려야죠 + 참고로 다이얼로그의 모서리를 둥글게 만드는 코드는 아래 설명부분에 있습니다! 결과 GIF 결과코드 BottomSheetFragmentDialog는 material 라이브러리에서 제공하므로 implement 해줍니다. 프로젝트를 생성하면 기본으로 되어있으니 없는분들만 추가해주시면 될 것 같습니다. implementation 'com.google.android.material:material:1.7.0' MainActivity의 xml에서는 이벤트를 발생시킬 버튼 한개를 생성해주시면 됩니다. 코드는 생략하겠습니다. XML Kotlin p..

[안드로이드] Spannable로 글자마다 다른 설정! [내부링크]

안녕하세요. 이번 포스팅은 하나의 문자열에서 글자의 자릿수마다 다른 설정을 줄 수 있는 Spannable String에 대해서 알아보겠습니다. Spannable String은 안드로이드 프레임워크 내부에서 제공하는 기능이며, 사용방법이 굉장히 다양하기 때문에 이번 예제에서는 자주 사용되는 몇가지만 다뤄보도록 하겠습니다. 결과 코드 아래 코드는 spannable string이라는 하나의 문자열의 한 부분을 수정한 코드입니다. TextView textView = findViewById(R.id.textView); SpannableStringBuilder span = new SpannableStringBuilder("spannable string"); span.setSpan(new android.text.s..

[Git] Commit 취소 및 되돌리기 - reset & revert [내부링크]

Github로 버전관리를 하다보면 에러가 존재하는 코드 혹은 다른 파일을 commit 하는 실수가 발생 할 수 있습니다. 깃허브는 지금까지의 모든 commit을 push하기 때문에 잘못된 기록이 남는것을 막기 위해선 특정 commit을 지워줘야 하겠죠. 그럼 특정 commit을 되돌리는 방법에 대해 알아보겠습니다. reset 주의! reset 명령어는 커밋한 기록 자체가 남지 않기 때문에 복구할 수 없습니다. 최대한 사용을 지양하며 revert 명령어의 사용을 권장합니다. 커밋 내역 확인하기 git log 저는 아래 캡처와 같이 총 4개의 커밋을 진행했습니다. 최근 하나의 커밋 지우기 git reset HEAD^ 가장 최근 커밋인 fourth commit이 사라진걸 확인 할 수 있습니다. 여러개의 커밋 ..

[안드로이드] 에러 'compileDebugJavaWithJavac' task and 'compileDebugKotlin' task jvm target compatibility should be set to the same Java version. 해결 [내부링크]

Error 'compileDebugJavaWithJavac' task (current target is 11) and 'compileDebugKotlin' task (current target is 1.8) jvm target compatibility should be set to the same Java version. 작성코드 Android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { jvmTarget='11' } ... } 자바 버전을 JavaVersion.VERSION_1_8(8)에서 JavaVersion.VERSI..

[안드로이드] 네비게이션 바 없애기( + 몰입모드) [내부링크]

작성코드 Java // 몰입모드로 전환됩니다 public void FullScreenMode() { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ); } // 몰입모드에서 시스템 네비게이션바만 보여줍니다 private void ShowNavBarOnly() { getWindow().getDecorView().setSystemUiVisibi..

[안드로이드] Jetpack Compose 배우기 - 0장 개요 [내부링크]

안녕하세요. 이번 포스팅부터 안드로이드의 UI 프레임워크인 Jetpack Compse에 대해 학습해 보려고합니다. 저는 지금까지 모든 프로젝트를 XML을 이용해 레이아웃을 생성하고, 바인딩하여 UI를 사용했는데요. 젯팩 컴포즈라는 기술을 사용해 보고 싶기도 하였고, 선언형 UI에 대한 장점을 익히 듣다보니 관심이 생겨 이번 기회에 블로그에 글을 기재하면서 같이 학습해볼 예정입니다. 기본적인 개념들부터 차근차근 공부할 예정이므로 특정 기술에 대한 심도깊은 탐구를 원하시는 분들에겐 그리 알맞은 포스팅이 되진 않을 수 있습니다. 그럼 지금부터 젯팩 컴포즈에 대한 간단한 소개와 특징들에 대해 알아보겠습니다. 참고서 선택 우선, 본 학습에서는 '젯팩 컴포즈로 개발하는 안드로이드 UI - 토마스 쿠네스' 라는 참고..