묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결코틀린 고급편
SynchronizedLazyImpl 함수관련 질문
태현님, 안녕하세요, 강의 잘듣고 있습니다! 9강 11분 35초 부분에서 질문이 있는데요. by Lazy안에 타고 들어가면 SynchronizedLazyImpl 함수가 스레드 세이프해서 위험할 수 있다고 말씀하셨는데 .. 어떤 의미인지 궁금해서 질문 글 올립니다. 시간되실 때 답변 부탁드려요 감사합니다!
-
해결됨코틀린 고급편
제네릭 클래스를 정의하는 경우, 반드시 변성을 고려하는 것이 바람직한가요?
안녕하세요 강사님! 코루틴 강의를 너무 재밌게 들어서 고급편까지 오게 되었습니다. 지금 변성과 관련된 내용까지 수강하였고, 이 내용을 다음과 같이 이해하였습니다.변성은 타입 인자로 전달된 클래스 간의 상속 관계를 제네릭 클래스에도 적용하기 위한 개념이다.변성이 적용된 경우, 타입 안전성을 위해 생산자 또는 소비자 역할만을 수행할 수 있다. 그런데 저는 아직 개발 경험이 부족해서 그런지, 강의에서 보여주신 Cage<T>와 같은 상황이 발생할 수 있다는 점은 공감하지만 실제로 그런 상황을 마주한 적은 없던 것 같습니다. 아무래도 제가 작성했던 로직 상 타입 인자로 전달된 클래스의 상속 관계를 제네릭 클래스에도 적용해야 할 필요성을 느껴본 적이 없어서 그랬던 것 같은데, 이렇듯 로직 상 임의의 제네릭 클래스에 변성을 줄만한 이유가 없는 상황에서도 생산자 / 소비자의 역할을 고려하여 변성을 명시하는 것이 best practice인지 궁금합니다!
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
id 이름을 줄때 @+id/id이름을 꼭 넣어줘야 하나요?
안녕하세요 강사님강의 재미있게 듣고 있습니다.다름이 아니라 @+id를 만들면서 궁금한게 생겼는데 @+id는 반드시 필수적으로 들어가야하는 걸까요? 아니면 html처럼 이름만 줄수 있는 방법이 있는지 궁금합니다
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
/v2/index.html로 책 등록시 서버에 연결이 불가능하거나, 네트워크 오류입니다. 라고 뜹니다ㅠㅠ
안녕하세요 최태현 강사님!강의 잘보고있습니다 : )다름이 아니라 제가 기존에 oracle을 사용하고 있어서 server port는 8089로 설정해서 사용하고 있습니다. localhost:8089/v1/index.html을 실행시켜서 사용자 등록, 책 등록을 하면 잘 실행이 되는데v2/index.html로 접속하여 책 등록을 하면 아무런 반응이 없다가 '서버에 연결이 불가능하거나, 네트워크 오류입니다.' 라는 alert 메시지를 봅니다. 이게 어떤 문제인지 알 수 있을까요??
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
데이터바인딩 gradle 오류
(사진)
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
FireBase 로드와 파일 경로 관련 질문
여기서 강의 '예제앱 만들기 1' 에서 res > layout 파일에서 xml 파일이 있어야 하는데 layaout 파일이 없어요.그리고 그 오른쪽 상단에 스타트 버튼도 비활성화 되어있는데 이것도 왜 그런지 모르겠어요.그리고plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("com.google.gms.google-services") } android { namespace = "com.example.myfirebaseapp" compileSdk = 33 defaultConfig { applicationId = "com.example.myfirebaseapp" minSdk = 24 targetSdk = 33 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true } } 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 { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.4.3" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } } dependencies { implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") implementation("androidx.activity:activity-compose:1.7.0") 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") 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") implementation(platform("com.google.firebase:firebase-bom:32.7.0")) implementation("com.google.firebase:firebase-analytics") }Firebase 로드가 조금 많이 바뀐거 같은데요, build.gradle.kts (module :app) 이 파일에 이런식으로 로드 하는게 맞나요..?
-
미해결윤재성의 Kotlin 기반 안드로이드 앱 개발 Part1 - UI Programming
예제 코드가 빌드가 않됩니다.
android studio giraffe 2023.3.1으로 공부하는데.강의해주신 내용과 거의 맞지 않습니다.이 정도면 강의를 내리는게 맞지 않을까요? ㅠㅠ
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
실시간데이터베이스에 안떠요..6:15초
6분15초에서 하는 list를 누르면 파이어베이스에 뭔가 생기는데 저는 안생겨요..이렇게 생기지 않습니다.....package com.bokchi.mysolelife.contentsList import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Toast import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.bokchi.mysolelife.R import com.google.firebase.Firebase import com.google.firebase.database.database class ContentListActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_content_list) val database = Firebase.database val myRef = database.getReference("message") myRef.setValue("Hello, World!") val rv : RecyclerView = findViewById(R.id.rv) val items = ArrayList<ContentModel>() items.add(ContentModel("title1", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblYPPY%2Fbtq66v0S4wu%2FRmuhpkXUO4FOcrlOmVG4G1%2Fimg.png", "https://philosopher-chan.tistory.com/1235")) items.add(ContentModel("title2", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FznKK4%2Fbtq665AUWem%2FRUawPn5Wwb4cQ8BetEwN40%2Fimg.png", "https://philosopher-chan.tistory.com/1236")) items.add(ContentModel("title3", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtig9C%2Fbtq65UGxyWI%2FPRBIGUKJ4rjMkI7KTGrxtK%2Fimg.png","https://philosopher-chan.tistory.com/1237")) items.add(ContentModel("title4", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOYyBM%2Fbtq67Or43WW%2F17lZ3tKajnNwGPSCLtfnE1%2Fimg.png", "https://philosopher-chan.tistory.com/1238")) items.add(ContentModel("title5", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fekn5wI%2Fbtq66UlN4bC%2F8NEzlyot7HT4PcjbdYAINk%2Fimg.png", "https://philosopher-chan.tistory.com/1239")) items.add(ContentModel("title6", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F123LP%2Fbtq65qy4hAd%2F6dgpC13wgrdsnHigepoVT1%2Fimg.png", "https://philosopher-chan.tistory.com/1240")) items.add(ContentModel("title7", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2KC3%2Fbtq64lkUJIN%2FeSwUPyQOddzcj6OAkPKZuk%2Fimg.png", "https://philosopher-chan.tistory.com/1241")) items.add(ContentModel("title8", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmBh5u%2Fbtq651yYxop%2FX3idRXeJ0VQEoT1d6Hln30%2Fimg.png", "https://philosopher-chan.tistory.com/1242")) items.add(ContentModel("title9", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlOnja%2Fbtq69Tmp7X4%2FoUvdIEteFbq4Z0ZtgCd4p0%2Fimg.png", "https://philosopher-chan.tistory.com/1243")) items.add(ContentModel("title10", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNNrYR%2Fbtq64wsW5VN%2FqIaAsfmFtcvh4Bketug9m0%2Fimg.png", "https://philosopher-chan.tistory.com/1244")) items.add(ContentModel("title11", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK917N%2Fbtq64SP5gxj%2FNzsfNAykamW7qv1hdusp1K%2Fimg.png", "https://philosopher-chan.tistory.com/1245")) items.add(ContentModel("title12", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeEO4sy%2Fbtq69SgK8L3%2FttCUxYHx9aPNebNwkPcI21%2Fimg.png", "https://philosopher-chan.tistory.com/1246")) items.add(ContentModel("title13", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdIKDG%2Fbtq64M96JFa%2FKcJiYgKuwKuP3fIyviXm90%2Fimg.png", "https://philosopher-chan.tistory.com/1247")) items.add(ContentModel("title14", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFtY3t%2Fbtq65q6P4Zr%2FWe64GM8KzHAlGE3xQ2nDjk%2Fimg.png", "https://philosopher-chan.tistory.com/1249")) items.add(ContentModel("title15", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOtaMq%2Fbtq67OMpk4W%2FH1cd0mda3n2wNWgVL9Dqy0%2Fimg.png", "https://philosopher-chan.tistory.com/1250")) val rvAdapter = ContentRVAdapter(baseContext, items) rv.adapter = rvAdapter rv.layoutManager = GridLayoutManager(this, 2) rvAdapter.itemClick = object : ContentRVAdapter.ItemClick { override fun onClick(view: View, position: Int) { Toast.makeText(baseContext, items[position].title, Toast.LENGTH_LONG).show() val intent = Intent(this@ContentListActivity, ContentShowActivity::class.java) intent.putExtra("url", items[position].webUrl) startActivity(intent) } } } }메세지 나야되는거 적었습니다...그런데도 안떠요
-
미해결2시간으로 끝내는 코루틴
suspend function의 일시 중단 여부는 어떻게 결정되나요?
안녕하세요 강사님, 좋은 강의에 항상 감사드리고 있습니다! 다른게 아니라, 강의 중 suspend function은 일시 중단 되었다가 재개될 수도 있고 / 그렇지 않을 수도 있다고 설명 주셨습니다. 그렇다면 실제로 suspend function이 일시 중단되어야 하는지 여부는 어떻게 결정되나요?단순히 suspend function 내부에서 또 다른 suspend function을 호출하기만 하면 무조건 일시 중단 되는 것인지, 아니면 Node.js 진영의 libuv 라이브러리처럼 비동기적으로 처리되어야 하는 IO 작업을 내부적으로 인지하는 방식이 별도로 구현되어 있는지 궁금합니다!
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
혹시라도 @DiplayName 어노테이션이 동작하지 않으신다면
위에 처럼[Build, Execution, Deployment > Build Tools > Gradle]의 Run tests using 설정을 '인텔리제이'로 변경하고,인텔리제이를 재시작하시면 정상동작됩니다.
-
미해결모던 안드로이드 - 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) ) } }
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
rv이 할때 에러가...
package com.bokchi.mysolelife.contentsList import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.recyclerview.widget.RecyclerView import com.bokchi.mysolelife.R class ContentListActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_content_list) val rv : RecyclerView = findViewById(R.id.rv) //여기 R.id.rv이 할때 rv가 에러가 나요 val items = ArrayList<String>() items.add("a") items.add("b") items.add("c") val rvAdapter = ContentRVAdapter(items) rv.adapter = rvAdapter } }왜 에러가 나는걸까요?
-
미해결[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가 꼭 쓰여야하는 특별한 상황이 남아있을까요?
-
미해결코틀린 고급편
실무에서 lateinit 이 필요한 경우는 어떤 상황일까요?
항상 좋은 강의 감사합니다! 최태현님 강의덕분에 코틀린으로 전환하고 있는 회사에서 적응하는데에 많은 도움 받고있습니다. 이번 질문은 lateinit 을 실무에서 사용하는 상황에 대한 것입니다. lateinit 을 사용하는 시점은, 클래스 인스턴스화 시점과 프로퍼티 초기화 시점을 분리하고 싶을 때라는 것은 이해했습니다.그런데, 실무에서 저런 경우가 어떤 상황인지 잘 생각이 나지 않습니다. 실무에서 lateinit 을 사용하는 경우, 즉 클래스 인스턴스화 시점과 프로퍼티 초기화 시점이 분리가 필요한 경우는 어떤 경우가 있는지 궁금합니다!
-
해결됨아이비의 안드로이드 드릴
학습에 대해
오리엔테이션에 있는 신입 안드로이드 개발자를 위한 학습로드맵에 나와있는 학습주제에 대해서 전부 배울 수 있는건가요??
-
미해결[중급편] 친절한 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 } }
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
baseContext 동작안함
package com.nadeukcha.horse import android.app.LauncherActivity import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.nadeukcha.horse.databinding.ActivityMainBinding class RacehorseDetailsFragment : Fragment() { private val items = mutableListOf<RacehorseModel>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment val view = inflater.inflate(R.layout.fragment_racehorse_details, container, false) items.add( RacehorseModel( "https://www.horsepia.com/hp/pa/hh/PAHH2010/search.do#none", "https://www.horsepia.com/hp/pa/ac/photoResizer.do?file=0047386&extend=l.jpg&width=312&height=191&type=3&hrsGbCd=00100&bfHrno=047386", "기적의돌풍" ) ) // items.add items.add( RacehorseModel( "https://www.horsepia.com/hp/pa/hh/PAHH2010/search.do#none", "https://www.horsepia.com/hp/pa/ac/photoResizer.do?file=0047386&extend=l.jpg&width=312&height=191&type=3&hrsGbCd=00100&bfHrno=047386", "기적의돌풍" ) ) // items.add items.add( RacehorseModel( "https://www.horsepia.com/hp/pa/hh/PAHH2010/search.do#none", "https://www.horsepia.com/hp/pa/ac/photoResizer.do?file=0047386&extend=l.jpg&width=312&height=191&type=3&hrsGbCd=00100&bfHrno=047386", "기적의돌풍" ) ) // items.add items.add( RacehorseModel( "https://www.horsepia.com/hp/pa/hh/PAHH2010/search.do#none", "https://www.horsepia.com/hp/pa/ac/photoResizer.do?file=0047386&extend=l.jpg&width=312&height=191&type=3&hrsGbCd=00100&bfHrno=047386", "기적의돌풍" ) ) // items.add val rv = view.findViewById<RecyclerView>(R.id.racehorseRv) val rvAdapter = RvAdapter(baseContext ,items) rv.adapter = rvAdapter // rv.layoutManager = LinearLayoutManager(context) rv.layoutManager = GridLayoutManager(context, 2) // 경기 내역 확인 view.findViewById<Button>(R.id.btn1).setOnClickListener { it.findNavController().navigate(R.id.action_racehorseDetailsFragment_to_matchdetailsFragment) } // 기수 상제 정보 view.findViewById<Button>(R.id.btn3).setOnClickListener { it.findNavController().navigate(R.id.action_racehorseDetailsFragment_to_riderDetailsFragment) } // 기록 정보 view.findViewById<Button>(R.id.btn4).setOnClickListener { it.findNavController().navigate(R.id.action_racehorseDetailsFragment_to_recordInfoFragment) } return view } }안녕하세요Fragment 강의에서 봤던 동작이랑 이번에 RecyclerView 강의를 합쳐서 화면을 만들어보고있었습니다그러던중 이번 강의 망고플레이트 앱 소개 및 레이아웃 - RecyclerView, Glide 강의의 24분 14초에 baseContext 추가하는 동작하를 하려고해는데 baseContext가 인식되지 않는 현상이있는데 따로 설정해줘야하는 부분이 있는건가요? baseContext를 넣으면 이런 오류가 나옵니다강의 내역과 조금 다른 질문인거같아 죄송합니다
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
웹뷰에서 사이트로 넘어갈 때 오류가 납니다.
package com.example.mango_content import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView class MainActivity : AppCompatActivity() { //데이터 넣을 리스트 변수 생성 private val items = mutableListOf<ContentsModel>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 리스트 데이터 // 데이터 클래스이기 때문에 차례대로 넣을 값만 넣어주면 된다 items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/Quiver/shopPhotoList", "https://image.toast.com/aaaaaqx/rv/s4XU7ZHko4NjDEkULtFHbAA/231108173855775(0).jpeg", "퀴버(Quiver)" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/bistrogama/shopPhotoList?pickup-date=231207&pickup-time=0342", "https://image.toast.com/aaaaaqx/catchtable/shopinfo/s23522/23522_2221020170729696.jpg?detail750", "비스트로 가마" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/cucciolo_seoul/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0346", "https://ugc-images.catchtable.co.kr/rv/s7YDg2g4TxcuMPb-Eds2nKQ/4179dd6517aa48e1900c08e8c9c769a5", "쿠촐로 서울" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/schedule_seongsu/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0352", "https://ugc-images.catchtable.co.kr/rv/sXGZ4Ldt3lvBgj3V-4rxIsQ/e6ce38eef9ee412ca63da36dacabc57a", "스케줄 성수" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/Quiver/shopPhotoList", "https://image.toast.com/aaaaaqx/rv/s4XU7ZHko4NjDEkULtFHbAA/231108173855775(0).jpeg", "퀴버(Quiver)" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/bistrogama/shopPhotoList?pickup-date=231207&pickup-time=0342", "https://image.toast.com/aaaaaqx/catchtable/shopinfo/s23522/23522_2221020170729696.jpg?detail750", "비스트로 가마" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/cucciolo_seoul/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0346", "https://ugc-images.catchtable.co.kr/rv/s7YDg2g4TxcuMPb-Eds2nKQ/4179dd6517aa48e1900c08e8c9c769a5", "쿠촐로 서울" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/schedule_seongsu/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0352", "https://ugc-images.catchtable.co.kr/rv/sXGZ4Ldt3lvBgj3V-4rxIsQ/e6ce38eef9ee412ca63da36dacabc57a", "스케줄 성수" ) ) val recyclerview = findViewById<RecyclerView>(R.id.rv) val rvAdapter = RVAdapter(baseContext,items) recyclerview.adapter = rvAdapter // 아이템 클릭 처리 rvAdapter.itemClick = object : RVAdapter.ItemClick { override fun onClick(view: View, position: Int) { val intent = Intent(baseContext, ViewActivity::class.java) intent.putExtra("url", items[position].url ) startActivity(intent) } } recyclerview.layoutManager = GridLayoutManager(this,2) } }MainActivity.kt package com.example.mango_content import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.appcompat.view.menu.MenuView.ItemView import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.bumptech.glide.Glide //viewmodel을 받을 것임 class RVAdapter(val context: Context, val List: MutableList<ContentsModel>) : RecyclerView.Adapter<RVAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RVAdapter.ViewHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.rv_item, parent, false) return ViewHolder(v) } // 웹뷰 클릭 이벤트 생성 interface ItemClick { fun onClick(view : View, position: Int) } var itemClick : ItemClick? = null override fun onBindViewHolder(holder: RVAdapter.ViewHolder, position: Int) { if (itemClick != null) { holder.itemView.setOnClickListener { v -> itemClick!!.onClick(v, position) } } holder.bindItems(List[position]) } override fun getItemCount(): Int { return List.size } inner class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) { fun bindItems(item : ContentsModel) { val rv_img = itemView.findViewById<ImageView>(R.id.rvImageArea) val rv_text = itemView.findViewById<TextView>(R.id.rvTextArea) rv_text.text = item.titleText Glide.with(context) .load(item.imageUrl) .into(rv_img) } } } RVAdapter.kt package com.example.mango_content import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.webkit.WebView class ViewActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_view) val webView = findViewById<WebView>(R.id.webView) webView.loadUrl(intent.getStringExtra("url").toString()) } }ViewActivity.kt<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Mango_content" android:usesCleartextTraffic="true" tools:targetApi="31"> <activity android:name=".ViewActivity" android:exported="false" /> <activity android:name=".SplashActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:exported="true"></activity> </application> </manifest>manifest.xml실행 했을 시, 다음과 같은 오류가 일어납니다.망고플레이트가 서버 종료되어서 저는 캐치테이블 사이트를 이용하였습니다.오류 구글링하여 매니패스트에android:usesCleartextTraffic="true" 도 추가 하였는데 그대로 오류나서 질문 드립니다. ㅠㅠ
-
미해결[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) }이렇게 하면 오류가 발생하는데 왜 그런지요 ...