일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- TowmonUSB 연결오류
- mutable
- compse state
- 안드로이드 스튜디오 애뮬레이터
- livedata
- apk이름변경
- withContext
- compse collectAsState
- Room 데이터베이스 업데이트
- 데이터바인딩
- TwomonUSB
- 코틀린 트리거 버튼
- 라이브데이터 postValue
- json 저장
- 코틀린 이미지저장 #파일저장
- 토글 험수
- Today
- Total
목록안드로이드 개발 (23)
EnjoyLife
collectAsState는 StateFlow나 Flow의 값을 State로 변환하여 사용할 수 있도록 해주는 함수입니다. State는 Compose에서 UI의 상태를 나타내는 데 사용되는 데이터 구조입니다. collectAsState를 사용하면 다음과 같은 장점이 있습니다. StateFlow나 Flow의 값을 UI에 직접 사용할 수 있습니다. StateFlow나 Flow의 값이 변경될 때마다 UI가 자동으로 리컴포즈됩니다. StateFlow나 Flow의 값이 변경될 때까지 UI가 멈추지 않습니다. collectAsState를 사용하지 않고 StateFlow나 Flow의 값을 UI에 직접 사용하면 다음과 같은 문제가 발생할 수 있습니다. UI가 StateFlow나 Flow의 값을 직접 변경할 수 있기 때..
동일한 결과가 나오지만 함수의 마지막 인자로 람다식을 적용한 코드가 더 간결함을 느낄수 있다. 람다코드의 매력은 함수의 마지막 인자가 람다식이면 중괄호{ } 로 표현하게 돼 소스가 간결해진다. 반환형이 Unit 으로 한 이유는 함수를 호출하기 위함이다. 반환값이 있으면 이방법을 쓸 이유가 없다. 일반코드 fun printNumbers(numbers: List) { for (number in numbers) { println(number) } } fun main() { val numbers = listOf(1, 2, 3) printNumbers(numbers) } 람다코드 fun printNumbers(numbers: List, action: (Int) -> Unit) { for (number in num..
우선 애뮬레이터 실행시 오류가 나면 아래 경로가 가서 로그기록을 보자 C:\Users\admin\AppData\Local\Google\AndroidStudio 버전\ 에서 idea.log 를 찾아서 "emulator" 검색하면 원인이 나온다. 저같은 경우 아래와 같은 코드가 나옴. "PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT" 역시 스택오버플로우다 ! 환경변수에 아래 형광펜을 그냥 믿고 따라 하자. 형광펜의 sdk 는 반드시 본인이 설정한 경로에 두자 https://stackoverflow.com/questions/41274830/panic-cannot-find-avd-system-path-please-define-android..
코틀린 버전 private fun isRooted(): Boolean { val buildTags = android.os.Build.TAGS if (buildTags != null && buildTags.contains("test-keys")) { return true } try { val file = File("/system/app/Superuser.apk") if (file.exists()) { return true } } catch (e: Exception) { } val rootBinaryPaths = arrayOf( "/sbin/su", "/system/bin/su", "/system/xbin/su", "/system/sd/xbin/su", "/system/bin/failsafe/su", "/d..
class MyActivity : AppCompatActivity() { private lateinit var mediaBrowserService: MyMediaBrowserService private lateinit var mediaSession: MediaSessionCompat private lateinit var player: ExoPlayer override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_my) // MediaBrowserService를 만듭니다. mediaBrowserService = MyMediaBrowserService()..
1.remember 은 @Composable로 선언한 함수내에서 데이터가 유지되고,회전시에는 데이터 초기화 2.rememberSaveable는 @Composable로 선언한 함수뿐만 아니라 화면 회전시에도 데이터 유지 아래코드는 count 변수를 rememberSaveable 선언해 카운트 증가버튼을 눌러 숫자가 증가한후 회전해도 숫자가 초기화가 되지 않는다.하지만 rember를 사용하면 회전시 초기화가 된다. @Composable fun StateExample() { val viewModel: MyViewModel = viewModel() val count by rememberSaveable { mutableStateOf(0) } Column( modifier = Modifier.fillMaxSize(..
//기본싱글턴 1 class MyClass { companion object { val name: String = "Kotlin" } } fun main(args: Array) { println(MyClass.name) // "Kotlin" } //커스텀 싱글턴2 class MySingleton private constructor() { companion object { private var instance: MySingleton? = null fun getInstance(): MySingleton { return instance ?: synchronized(this) { instance ?: MySingleton().also { instance = it } } } } } fun main(args: Ar..