목록프로그래밍/안드로이드, 코틀린 (35)
몰?.루();
파이어베이스를 사용하다보면 클라우드 메세징Cloud Messaing 기능을 사용하는 경우가 있습니다. 이를 통해서 앱에 푸쉬 알림을 간편하게 보낼 수 있습니다. 다만 한국에서는 광고성 푸쉬 알림을 보낼 때 주의해야할 사항들이 몇 가지 있습니다. 자세한 건 이 포스팅에서 다루지 않겠지만, 대충 개발자가 유의해야할 사항은 다음과 같습니다. 광고성 푸쉬 알림을 보내기 위해서는 사용자에게 별도로 승인 요청을 받아야하며, 광고를 허용 받았든 거부 받았든 통지해야한다. 2년마다 광고성 푸쉬 알림을 계속해서 받을지 말지 확인 받아야한다. (2년마다 확인 여부 화면을 띄워주기만 하면 되고, 사용자가 딱히 의사 표현을 하지 않았다면 그냥 계속 광고 허용한 걸로 간주해도 됨) 하지만 문제는 클라우드 메시징으로 보낸 푸쉬 ..
학부생 때나 하던 건데 오랜만에 갑자기 퀵 소트 구현이나 해볼까해서 위키피디아에 있는 퀵 소트 수도 코드를 보면서 코틀린으로 그대로 옮겨봤습니다 fun main() { val array = intArrayOf(3,7,8,5,2,1,9,5,4) array.quickSort() println(array.contentToString()) // [1, 2, 3, 4, 5, 5, 7, 8, 9] } fun IntArray.quickSort(start: Int = 0, end: Int = this.size - 1) { if (start >= 0 && end >= 0 && start < end) { val pivotIndex = this.partition(start, end) this.quickSort(start, ..
lateinit var a: String // 가능 lateinit var b: Int // 불가능 lateinit var c: Integer // 가능 왜냐하면 코틀린 코드를 자바로 변환했을 때 lateinit을 구현하는 방법 자체가 변수를 일단 null로 해놓고, getter를 호출하는 시점에 변수가 아직 null이면 Exception을 throw하는 방식이기 때문입니다. 그렇기 때문에 String 같은 non-primitive type들은 처음에 null을 일단 선언해놓을 수 있는데 int 같은 primitive type들은 처음에 null로 선언할 수가 없기 때문에 (자바에서 int형에 null을 넣을 수 없습니다. 멤버 변수 선언할 때 그냥 int a; 이렇게 선언만 해놓는 것도 결국엔 int ..
Android Jetpack에 포함되어있는 유명한 라이브러리 중 하나가 LiveData입니다. 값의 변화를 liveData.observe(this, Observer { // ... }) 이런 식으로 관찰해서 사용할 수 있기 때문에 많이 사용됩니다. 그리고 이 LivaData가 디자인 패턴 중에 옵저버 패턴을 사용하는 대표적인 예시 중 하나이기 때문에 옵저버 패턴을 공부할 겸 평소에 유용하게 쓰던 LiveData를 직접 구현해보겠습니다. class SimpleLiveData { private var data: T? = null private val observers = mutableListOf Unit>() fun observe(observer: (T?) -> Unit) { observers.add(obs..
인터넷에 검색해보면 다들 참 어려운 방법을 쓰고 앉아있는데 사실 요즘은 참 쉬운 방법이 있습니다. xml에서 버튼 속성에 app:cornerRadius="{숫자}dp"만 주면 됩니다. 참고로 Button에만 적용되고 TextView나 다른 것들엔 적용 안 되기 때문에 어려운 방법으로 구현해야하는 게 맞습니다. 버튼만 쉽게 가능.
제가 원한 것은 SubActivity를 띄웠을 때 바로 스크롤뷰가 특정 scrollY만큼 이동한 상태에서 화면이 보여지는 것이었습니다. 원했던 그림 실패한 코드 1 - onCreate나 onResume에 setScrollY 넣어보기 package com.example.test import android.os.Bundle import android.widget.ScrollView import androidx.appcompat.app.AppCompatActivity class SubActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setCont..
안드로이드 스튜디오의 terminal을 git bash로 설정해놓은 경우 한글을 입력하는 건 그럭저럭 잘 되는데 지울 때 정말 이상하게 지워집니다. 평소에는 크게 문제가 되지 않는데 git commit을 할 때 커밋 메세지를 한글로 남겨야하기 때문에 이 버그는 굉장히 짜증납니다. 아무리 검색해도 해결 방법이 안 나오다가 그냥 우연히 이것저것 해보다가 해결법을 발견해서 공유합니다. 설정(Ctrl + Atl + S)에서 Tools - Terminal - Shell path 에서 {bash 경로} 뒤에 --login을 덧붙여주고 OK를 눌러서 설정창을 끄고 나서 터미널을 종료시켰다가 다시 켜면 한글 문제가 해결됩니다. 대체 --login을 붙였는데 왜 해결되는거고 무슨 역할을 하는 건지는 모르겠지만 일단 문제..
두괄식으로 결론부터 조지자면 // 액티비티에 이 코드 삽입 val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as MyFragment fragment.myFragmentFuncion() 이렇게 하시면 됩니다. 메인 액티비티 소스 코드(MainActivity.kt) package com.example.test import android.os.Bundle import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { supe..
코틀린에는 확장 함수가 존재합니다. 이미 있는 클래스에 내가 원하는 기능의 함수를 추가할 수 있습니다. fun String.isHello(): Boolean { return (this == "hello") } 예를 들어 위와 같이 어떤 문자열이 "hello"인지 판단해주는 아주 쓸모 없는 확장 함수를 제가 직접 만들 수 있습니다. 이렇게 확장 함수를 만들어놓으면 "hello".isHello() // true "hi".isHello() // false 이런 식으로 String 뒤에 점(.)을 붙이고 isHello()를 해서 마치 코틀린 자체에서 isHello라는 String 함수를 추가해놓은 것처럼 사용할 수 있습니다. 근데 이 확장 함수 기능은 자바에는 없습니다. 자바 파일에 가서 아무리 "hello"...
코틀린에는 스코프 함수 5형제가 있습니다. 알아두면 매우 유용하지만 그만큼 헷갈리는 친구들이기도 하기 때문에 정리해보겠습니다. 키워드 객체 참조 리턴값 .let it 마지막 줄 .also it 참조 객체 .run this 마지막 줄 with this 마지막 줄 .apply this 참조 객체 이미 스코프 함수를 아시는데 잠깐 까먹은 분들은 위의 표만으로 충분하지만 처음보면 뭔 소린지 알 수 없기 때문에 예시를 들어보겠습니다. .let let의 객체 참조는 it을 쓰고 리턴값은 스코프 마지막 줄입니다. 보통 null-check를 할 때 많이 씁니다 let을 사용하지 않고는 코드를 다음과 같이 써야합니다. val num: Int? = getNumberFromServer() // 서버로부터 오는 값 var i..