묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결모던 안드로이드 - Jetpack Compose 입문
구글맵강의중에서 ..
설날을 맞이하신 강사님 새해에도늘 건강하시고 부자되세요 ^^ 프로젝트폴더에서 New >> Fragment >> Google Map Fragment 를 선택하고 Fragment Name 을 MapsFragment 로 해서 Finish 버튼을 누르면프로젝트폴더내에 MapsFragment.kt 파일과res/layout 폴더내에 fragment_maps.xml 파일은 생성이 되나res/values 폴더내에 google_maps_api.xml 파일은 생성되지 않습니다 그리고 관련파일들을 실행하여도 오류는 없으나구글맵이 나타나지 않고 빈화면만 뜹니다 git 에 파일들을 올려두었습니다https://github.com/dongguntechnology/GoogleMap
-
해결됨아이비의 안드로이드 드릴
툴바 제목에 폰트색상 적용이 안됩니다.
안녕하세요 강사님, 수업 잘 듣고 있습니다.폰트 색깔이 변경되지 않아 질문드립니다강의내용과 동일하게 스타일을 적용했는데 여전히 검은색으로 나오는 문제가 반복됩니다. 아래와 같이 코드를 변경하고, apptexttitle을 적용했을 때에도 회색으로 변경되지 않는 문제가 있습니다. 어떤 걸 살펴봐야 할까요? <?xml version="1.0" encoding="utf-8"?> <resources> <style name="AppToolbar" parent="Widget.MaterialComponents.Toolbar"> <item name ="titleTextAppearance">@style/AppTextTitle.S18</item> </style> <style name="AppTextTitle"> <item name="android:textColor">@color/gray10</item> <item name="android:textStyle">bold</item> <item name="android:textSize">18sp</item> </style> <style name="AppTextTitle.S18"> <item name="android:textColor">@color/gray10</item> <item name="android:textSize">18sp</item> </style> <style name="AppTextS14"> <item name="android:textColor">@color/gray1</item> <item name="android:textSize">18sp</item> </style> <style name="AppTextPrimary"> <item name="android:textColor">@color/blue</item> <item name="android:textStyle">bold</item> <item name="android:textSize">14sp</item> </style> </resources>
-
미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Coroutine, Flow 질문
안녕하세요. 강의 잘 듣고 있습니다!아래 질문이랑 거의 비슷한 질문이긴한데 확실히 하고싶어 문의드립니다 import kotlinx.coroutines.*import kotlinx.coroutines.flow.*fun main() = runBlocking<Unit> { // Launch a concurrent coroutine to check if the main thread is blocked launch { for (k in 1..3) { println("I'm not blocked $k") delay(100) } } // Collect the flow simple().collect { value -> println(value) } // println("test") }fun simple(): Flow<Int> = flow { // flow builder for (i in 1..3) { delay(100) // pretend we are doing something useful here emit(i) // emit next value }} runBlocking{} 내부에서 launch {} 로 코루틴이 생성그다음 simple().collect{} 코드가 실행되는데 이것도 코루틴으로서 생성launch 로 생성한 코루틴이 실행 -> println("I'm not blocked $k") 코드 출력flow 코루틴 실행-> collect 된 value 출력3,4 반복이해한게 맞을까요? 그리고 타이밍에 따라서 결과값이1I'm not blocked 12I'm not blocked 2 3I'm not blocked 3 이렇게 나올수도 있나요? 챗지피티는 타이밍 때문에 출력 순서가 바뀔수 있다고 해서요 ..
-
미해결[LV1] Jetpack Compose - UI 연습하기
CoupangEx 4 강에서
강사님 늘 건강하시고 부자되세요 Icon(imageVector = iconList[index % iconList.size],코드를 Icon(imageVector = iconList[index],로 바꾸어도 출력은 동일하게 나오는데 index % iconList.size코드가 의미하는 것을 무엇일까요 ???
-
미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Transformations import 안됨
androidx.lifecycle 패키지에 Transformations 가 없어서 참조가 안됩니다! Unresolved reference라고 하네용..Deprecated 된것 같진 않은데 사용방법이 달라진걸까요?val userLD : LiveData<User> = ...; val userFullNameLD: LiveData<String> = userLD.map { user -> user.firstName + user.lastName }공식문서에 보니 이것처럼 먼저 생성한 LiveData나 MutableLiveData 를 참조해서 map 을 사용하는데 이런식으로 사용해야할까요?+) 그리고 transformations 를 사용하는 이유나 언제 사용해야하는지? 이해가 잘 안되는데, 예시처럼 prefix나 suffix 가 필요할 때 사용하기 좋은가요?MainActivity 에서 myViewModel.liveCounter.value = myViewModel.liveCounter.value?.plus(1) 이건 원본 데이터를 조작한게 아닌건가요?
-
미해결냉동코더의 알기 쉬운 Modern Android Development 입문
moshi관련 질문입니다.
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-kapt") id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") } android { namespace = "com.example.booksearchapp" compileSdk = 34 defaultConfig { applicationId = "com.example.booksearchapp" minSdk = 23 targetSdk = 34 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } buildFeatures { buildConfig = true viewBinding = true } } dependencies { implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.11.0") implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.legacy:legacy-support-v4:1.0.0") // Retrofit implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-moshi:2.9.0") // Okhttp // define a BOM and its version implementation(platform("com.squareup.okhttp3:okhttp-bom:4.12.0")) // define any required OkHttp artifacts without version implementation("com.squareup.okhttp3:okhttp") implementation("com.squareup.okhttp3:logging-interceptor") // Moshi implementation("com.squareup.moshi:moshi-kotlin:1.14.0") kapt("com.squareup.moshi:moshi-kotlin-codegen:1.14.0") // Lifrcycle implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.7.0") // Coroutines implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") // Coil implementation("io.coil-kt:coil:2.5.0") // RecyclerView implementation("androidx.recyclerview:recyclerview:1.3.2") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") } 위처럼 설정을 하고 빌드를 할때 아래와 같은 에러가 발생합니다.Execution failed for task ':app:kaptDebugKotlin'.> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction > java.lang.reflect.InvocationTargetException (no error message)jdk는 17을 사용하고 있습니다.11로 설정하면 아래와 같은 에러가 나옵니다.is project is configured to use an older Gradle JVM that supports up to version 11 but the current AGP requires a Gradle JVM that supports version 17. 어느 부분을 수정해야될 지 모르겠습니다.. ㅜㅜ
-
미해결[LV1] Jetpack Compose - UI 연습하기
HorizontalPagerIndicator 의 pagerState = pageState, 에서 빨간줄이 생깁니다
MainActivity.ktimport androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.runtime.getValue import androidx.compose.ui.text.font.FontWeight import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.material3.ExperimentalMaterial3Api import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.HorizontalPagerIndicator class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ShopEx() } } } @Composable fun ShopEx() { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { Column() { TopLogo() TopSearchBar() TopBanner() } } } @Composable fun TopLogo(){ Box(){ Box( modifier = Modifier .fillMaxWidth() .height(60.dp), contentAlignment = Alignment.Center ){ Row(){ Text("C", fontSize = 30.sp, color= Color(0xff964b00)) Text("O", fontSize = 30.sp, color= Color(0xff964b00)) Text("U", fontSize = 30.sp, color= Color(0xff964b00)) Text("P", fontSize = 30.sp, color= Color.Red) Text("A", fontSize = 30.sp, color= Color.Yellow) Text("N", fontSize = 30.sp, color= Color.Green) Text("G", fontSize = 30.sp, color= Color.Blue) } Icon( imageVector = Icons.Default.ShoppingCart, // ImageVector 아이콘지정 contentDescription = "쇼핑", modifier = Modifier .align(Alignment.CenterEnd) .padding(end = 20.dp) ) } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun TopSearchBar(){ var inputText by remember { mutableStateOf("") } Box( modifier = Modifier .fillMaxWidth() .border(1.dp, Color.Gray, shape = RoundedCornerShape(10.dp)) .padding(start = 20.dp, end = 20.dp), contentAlignment = Alignment.Center ){ TextField( value = inputText, onValueChange = { inputText = it }, leadingIcon = { Icon(imageVector = Icons.Default.Search, contentDescription = null)}, placeholder = { Text(text = "쿠팡에서 검색하세요")}, modifier = Modifier.fillMaxWidth(), colors = TextFieldDefaults.textFieldColors( containerColor = Color.White, focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent ) ) } } @OptIn(ExperimentalFoundationApi::class, ExperimentalPagerApi::class) @Composable fun TopBanner(){ val pageCount = 5 val pageState = rememberPagerState() val textList = listOf( "광고 문구1", "광고 문구2", "광고 문구3", "광고 문구4", "광고 문구5" ) Box( modifier = Modifier.padding(top = 20.dp) ) { HorizontalPager( pageCount = pageCount, state = pageState, modifier = Modifier .fillMaxSize() .height(200.dp) .background(Color.LightGray), ) { page -> Text( text = textList[page], fontSize = 30.sp, fontWeight = FontWeight.ExtraBold, ) } HorizontalPagerIndicator( pagerState = pageState, modifier = Modifier .align(Alignment.BottomCenter) .padding(15.dp) ) } } @Preview(showBackground = true) @Composable fun GreetingPreview() { ShopExTheme { ShopEx() } } build.gradle.kts dependencies { implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") implementation("androidx.activity:activity-compose:1.8.2") implementation(platform("androidx.compose:compose-bom:2023.03.00")) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") testImplementation("junit:junit:4.13.2") implementation ("com.google.accompanist:accompanist-pager:0.20.2") implementation ("com.google.accompanist:accompanist-pager-indicators:0.20.2") implementation ("com.google.accompanist:accompanist.pager.PagerState") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") }
-
미해결냉동코더의 알기 쉬운 Modern Android Development 입문
searchBooks() 에서 북 검색 입력을 너무 빨리 할 경우 마지막 글자로 검색이 안돼요.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 아래 코드를 private fun searchBooks() { var startTime = System.currentTimeMillis() var endTime: Long binding.etSearch.text = Editable.Factory.getInstance().newEditable(searchViewModel.query) binding.etSearch.addTextChangedListener { text: Editable? -> endTime = System.currentTimeMillis() if (endTime - startTime >= SEARCH_BOOKS_TIME_DELAY) { text?.let { val query = it.toString().trim() if (query.isNotEmpty()) { searchViewModel.searchBooksPaging(query) searchViewModel.query = query } } } startTime = endTime } }아래처럼 바꿔봤는데 입력 시마다 runnable을 매번 생성하는데 문제 되진 않을까요? 코틀린에 익숙치 않아서 더 좋은 방법이 있다면 알고 싶습니다. private var handler: Handler = Handler(Looper.getMainLooper()) var runnable: Runnable? = null private fun searchBooks() { binding.etSearch.addTextChangedListener { text: Editable? -> if (runnable != null) { handler.removeCallbacks(runnable!!) } // 텍스트 입력 후 N 초 간 입력 없으면 검색 실행 runnable = Runnable { text?.let { Log.d(TAG, "text:$it"); val query = text.toString().trim() if (query.isNotEmpty()) { bookSearchViewModel.searchBooks(text.toString()) bookSearchViewModel.query = query } } } handler.postDelayed(runnable!!, Constants.SEARCH_BOOKS_TIME_DELAY) } }
-
미해결냉동코더의 알기 쉬운 Modern Android Development 입문
안드로이드에서 아키텍처 패턴
안녕하세요. 강의 잘 듣고 있습니다.안드로이드 패턴에 대해서 몇 시간동안 듣고 검색도 해보면서 이해하는 중인데 어려움이 있어 질문을 드립니다. MVC에서 그림에서 이해가 안되는 부분이 있습니다. [1] 안드로이드에서 버튼은 결국 View가 가지고 있고 이벤트는 View에 있는 버튼을 눌러서 발생하기 시작할 것 같습니다. 그럼 뷰는 입력 받은 이벤트에 대해 컨트롤러에게 전달을 해줘야할 것이고 컨트롤러는 전달 받은 이벤트에 대한 작업을 수행하고 모델에 전달 후 모델의 변경을 다시 뷰에게 전달해주는 것인데 이런 생각으로 인풋은 뷰쪽으로뷰와 컨트롤러는 쌍방향 화살표가 되어야한다고 생각했습니다. [2] MVP에 경우에 View와 Model사이 간접적 화살표가 사라졌는데, MVP에 경우에도 프레젠트를 사이에 두고 모델에 데이터가 뷰쪽으로도 이동해야만 한다고 생각이 들고 그렇다면 간접적으로 이동하는 것은 똑같으니 MVC에서 M->V 점선 화살표가 유지되어야 하는 거 아닌가 하는 생각이 들었습니다. [3] MVP에서 프레젠트가 인터페이스를 통해 뷰와 모델을 거치게 되는데[MVC] V <-> C[MVP] V <-> Interface <-> Presenter한 단계를 추가해서 의존성 주입(관심사를 세분화)라고 이해해도 될까요? 혹시나 시간이 되신다면 설명 부탁드립니다.
-
미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
안드로이드 테마 색상 오류
공부하는 프로젝트에 넣고 싶은 색상이 있는데 적용이 안됩니다. 테마를 Theme.Material3.DayNight.NoActionBar 이걸 적용중인데 회색으로 설정하면 연두색으로 나오면서 이상해서요 ㅠㅠㅠ 이거 해결 방법 없나요??ㅠㅠㅠㅠ Material3 이걸 바꾸면 머터리얼 디자인3가 자동으로 적용이 안되구요 ㅠㅠㅠ예를들면 #F0F0F0 컬러에 넣어두고 사용하면 연한 연두색으로 나옵니다
-
미해결모던 안드로이드 - Jetpack Compose 입문
drawCircle( color = Color.... 부분에서 빨간줄이 ...
강사님의 노고에 다시한번 감사드리며질문드립니다 TiltScreen 부분의 Color.BlackColor.Green부분에 빨간줄이 생기는데 이유가 뭘까요 import android.app.Application import android.content.Context import android.graphics.Color import android.hardware.Sensor import android.hardware.SensorEvent import android.hardware.SensorEventListener import android.hardware.SensorManager import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.drawscope.Stroke import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner import com.dongguntech.copose_tiltsensor.ui.theme.Copose_TiltSensorTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { Copose_TiltSensorTheme { TiltScreen() } } } } class MainViewModel(application: Application) : AndroidViewModel(application), SensorEventListener, LifecycleEventObserver { private val _value0 = mutableStateOf(0f) val x: State<Float> = _value0 private val _value1 = mutableStateOf(0f) val y: State<Float> = _value1 private val sensorManager by lazy { application.getSystemService(Context.SENSOR_SERVICE) as SensorManager } fun registerSensor() { sensorManager.registerListener( this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL // 센서의 작동주기 ) } private fun unregisterSensor() { sensorManager.unregisterListener(this) } override fun onSensorChanged(event: SensorEvent?) { event?.let { Log.d( "MainViewModel", "onSensorChanged x: ${event.values[0]}, y: ${event.values[1]}, z: ${event.values[2]}" ) _value0.value = event.values[0] // x 값 _value1.value = event.values[1] // y 값 } } override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { } override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { if (event == Lifecycle.Event.ON_RESUME) { registerSensor() } else if (event == Lifecycle.Event.ON_PAUSE) { unregisterSensor() } } } @Composable fun TiltScreen(x: Float, y: Float) { val yCoord = x * 20 val xCoord = y * 20 Canvas(modifier = Modifier.fillMaxSize()) { // 원의 중심 val centerX = size.width / 2 val centerY = size.height / 2 // 바깥 원 drawCircle( color = Color.Black, radius = 100f, center = Offset(centerX, centerY), style = Stroke() ) // 녹색 원 drawCircle( color = Color.Green, radius = 100f, center = Offset(xCoord + centerX, yCoord + centerY), ) // 가운데 십자가 drawLine( color = Color.Black, start = Offset(centerX - 20, centerY), end = Offset(centerX + 20, centerY) ) drawLine( color = Color.Black, start = Offset(centerX, centerY - 20), end = Offset(centerX, centerY + 20) ) } }
-
미해결[LV1] Jetpack Compose - UI 연습하기
colorList 에서 빨간줄이 ...
언제나 수고많으신 강사님늘 건강하시고 부자되세요 실행 후 아래와 같은 오류가 발생합니다 import android.graphics.Color import android.util.Size import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.dongguntech.compose_navi_graphes.ui.theme.Compose_Navi_GraphesTheme @Composable fun Graph2() { GraphPie() } @Composable fun GraphPie() { val pieSize1 = 25f val pieSize2 = 75f val colorList = listOf(Color.RED, Color.BLUE) PieChart( pieSize1, pieSize2, colorList, ) } @Composable fun PieChart( pieSize1 : Float, pieSize2 : Float, colorList : List<Color> ) { val totalSize = pieSize1 + pieSize2 BoxWithConstraints( modifier = Modifier.padding(20.dp) ) { val pieDetailSize = constraints.maxWidth.toFloat() Canvas(modifier = Modifier.size(pieDetailSize.dp)){ val sweep1 = 360 * (pieSize1 / totalSize) drawArc( color = colorList[0], startAngle = 0f, sweepAngle = sweep1, useCenter = true, size = Size(pieDetailSize, pieDetailSize) ) val sweep2 = 360 * (pieSize2 / totalSize) drawArc( color = colorList[1], startAngle = sweep1, sweepAngle = sweep2, useCenter = true, size = Size(pieDetailSize, pieDetailSize) ) } } } @Preview(showBackground = true) @Composable fun Graph2Preview() { Compose_Navi_GraphesTheme { Graph2() } }위 코드중에서 아래 캡쳐화면부분중에서colorList 에서 빨간줄 이 생기네요 또 실행하면 아래와 같은 오류가 발생합니다
-
해결됨냉동코더의 알기 쉬운 Modern Android Development 입문
RecyclerView.Adapter vs ListAdpater
안녕하세요.ListAdapter로 리사이클러뷰를 생성할 때의 장점으로는 notify관련 함수를 개발자가 일일이 설정해줄 필요가 없고, DiffUtil을 통해 데이터 셋의 차이를 빠르게 계산해준다는 점이 있다라고 말씀해주셨는데 ... 그럼 기존의 Recyclerview.Adapter는 사용하지 않는 편이 더 좋은걸까요? 아니면 ListAdapter에 이러한 장점들이 있음에도 불구하고 Recyclerview.Adapter가 꼭 쓰여야하는 특별한 상황이 남아있을까요?
-
해결됨아이비의 안드로이드 드릴
학습에 대해
오리엔테이션에 있는 신입 안드로이드 개발자를 위한 학습로드맵에 나와있는 학습주제에 대해서 전부 배울 수 있는건가요??
-
미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
Map / SwitchMap - 2 강의 오류
Map / SwitchMap - 2 강의의 1분 29초 쯤에val mapLiveData = Transformations.map(liveCount) { it+it }란 코드가 있는데요 Transformations 를 못불러오고강의자료를 그대로 복붙했는데 이런식으로 빨간줄이 납니다.import를 못해오는거 같습니다switchMap도 마찬가지로 안됩니다. Transformations 를 임포트 못받아옵니다! 찾아보니 gradle에 이부분을 임포트 받고 implementation("androidx.lifecycle:lifecycle-livedata-core:2.3.1")이런식으로 사용하니까 되더라고요. 이런식으로 하고 진행해도 되는거겠죠?class MainViewModel : ViewModel() { private var _mutableCount = MutableLiveData(0) val liveCount : LiveData<Int> get() = _mutableCount val mapLiveData = liveCount.map { it+it } val switchMapLiveData = liveCount.switchMap { changeValue(it) } fun setLiveDataValue(count : Int) { _mutableCount.value = count } fun changeValue(count : Int) : MutableLiveData<Int> { val testLiveData = MutableLiveData(count*count) return testLiveData } }
-
미해결[LV1] Jetpack Compose - UI 연습하기
Canvas drawCircle 에서
androidx.compose.foundation.Canvas( modifier = Modifier .fillMaxSize() ) { drawCircle( color = Color.Black, radius = size.minDimension/10, ) }늘 수고 많으신 강사님의 노고에 다시한번 감사드리며위 처럼 코딩하면 오류가 없으나 Canvas(modifier = Modifier.fillMaxSize()) { drawCircle(Color.Black, radius = size.minDimension / 10) }이렇게 하면 오류가 발생하는데 왜 그런지요 ...
-
미해결[LV1] Jetpack Compose - UI 연습하기
Canvas drawCircle 에서
수강에 어려움이 있으신가요?언제든 편하게 문의주세요! 문의주실 때 전체 코드를 깃허브나 구글 드라이브에 업로드해주시고 링크를 함께 공유해주시면빠르게 살펴볼 수 있습니다. 서로 오고가는 따뜻한 말 한마디가 있다면 저와 수강생분 모두 좋을꺼에요!
-
미해결[중급편] 친절한 JETPACK 개론 <하> (Android Kotlin)
DataStoreEx 파트 class MyDataStore(context: Context) { 수정 제안)
기존 : 지역 변수DataStoreEx 파트 class MyDataStore {... private val Context.dataStore : DataStore<Preferences> by preferencesDataStore("user_pref")...}제안 : 전역 변수로 변경private val Context.dataStore : DataStore<Preferences> by preferencesDataStore("user_pref")DataStoreEx 파트 class MyDataStore {...} 위 내용을 코딩중 Context.dataStore은 전역 변수 또는 싱글톤으로 제작 해야 안정적으로 보입니다 . 예를 들어서 Activity안에 위 클래스를 생성하는 코드를 작성한 후 동작 하면 일단은 동작 합니다.하지만 다시 Activity에 진입하면 에러가 납니다.DataStore version 1.0.0입니다. 왜 그런지 찾아 보니버전 1.0.0-alpha072021년 2월 24일androidx.datastore:datastore-*:1.0.0-alpha07이 출시되었습니다. 버전 1.0.0-alpha07에 포함된 커밋을 확인하세요.API 변경사항Context.createDataStore 확장 함수를 삭제하고 globalDataStore 속성 위임으로 대체했습니다. kotlin 파일의 최상위 수준에서 globalDataStore를 한 번 호출합니다. 예:val Context.myDataStore by dataStore(...) kotlin 파일의 최상위 수준에 배치하면 이 인스턴스가 하나만 생깁니다. (I57215, b/173726702)RxDataStore 함수는 이제 DataStore의 확장 함수 대신 RxDataStore 클래스에 있습니다. (Idccdb, b/177691248)EncryptedSharedPreferences를 DataStore로 이전(또는 SharedPreferences를 직접 부팅)하려는 경우 이제 SharedPreferences를 삽입할 수 있는 새로운 SharedPreferencesMigration 생성자를 사용하면 됩니다. (I8e04e, b/177278510)================================버그 수정동일한 파일에 활성 DataStore가 여러 개 있는 경우 이제 DataStore에서 예외가 발생합니다. DataStore를 싱글톤으로 관리하지 않았거나 한 파일의 DataStore 인스턴스 두 개가 동시에 활성화되지 않도록 조치하지 않은 경우 이제 DataStore를 읽거나 DataStore에 쓸 때 예외가 발생할 수도 있습니다. DataStore를 싱글톤으로 관리하면 해결할 수 있습니다. (Ib43f4, b/177691248)호출자 범위 취소 시의 취소 동작을 수정합니다. (I2c7b3) 라고 적혀 있네요 ... 그래서 전 Context.myDataStore를 전역 변수로 수정하고 테스트 했는데 정상적으로 동작 되는것을 확인 했습니다. 이상입니다.
-
해결됨아이비의 안드로이드 드릴
아이비 선생님, 학습자료는 어디서 다운받을 수 있나요?
안녕하세요. 아이비 선생님, 수강생 류지영입니다.강의소개 페이지에서 안내해주신 학습자료는 어디서 다운받을 수 있나요? 😀 학습 자료안드로이드 프로젝트 3개 구현 코드 Figma 프로젝트 링크개념 학습을 위한 예제 코드
-
미해결모던 안드로이드 - Jetpack Compose 입문
val scaffoldState = rememberScaffoldState() 에서 빨간줄이 생기네요
늘 수고많으신 강사님의 노고에 감사드립니다아래 코드중 val scaffoldState = rememberScaffoldState() 에서 빨간줄이 생기네요 class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val viewModel = viewModel<MainViewModel>() HomeScreen(viewModel = viewModel) } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen(viewModel: MainViewModel) { val focusManager = LocalFocusManager.current val (inputUrl, setUrl) = rememberSaveable { mutableStateOf("https://www.google.com") } val scaffoldState = rememberScaffoldState() Scaffold ( topBar = { TopAppBar( title = { Text("나의 웹브라우져")}, actions = { IconButton(onClick = { viewModel.undo() }){ Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "back", tint = Color.Black ) } IconButton(onClick = { viewModel.redo() }){ Icon( imageVector = Icons.Default.ArrowForward, contentDescription = "forward", tint = Color.Black ) } } ) } ) { paddingValues -> Column( modifier = Modifier .padding(16.dp) .fillMaxSize() ) { OutlinedTextField( value = inputUrl, onValueChange = setUrl, label = { Text("https://")}, modifier = Modifier .padding(paddingValues) .fillMaxWidth(), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), keyboardActions = KeyboardActions(onSearch = { viewModel.url.value = inputUrl focusManager.clearFocus() }), ) Spacer(modifier = Modifier.height(16.dp)) MyWebView(viewModel = viewModel) } } } @Composable fun MyWebView(viewModel: MainViewModel) { val scope = rememberCoroutineScope() AndroidView( modifier = Modifier.fillMaxSize(), factory = { WebView(it).apply { settings.javaScriptEnabled = true webViewClient = WebViewClient() loadUrl("https://google.com") } }, update = { webView -> webView.loadUrl(viewModel.url.value) scope.launch{ viewModel.undoSharedFlow.collectLatest { if(webView.canGoBack()) { webView.goBack() } } } scope.launch{ viewModel.redoSharedFlow.collectLatest { if(webView.canGoForward()) { webView.goForward() } } } }, )