25%
41,250원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
viewModel 초기화 관련 질문드려요
저번 강의에서는 viewModel 초기화 시에 Activity에 viewModel을 선언하고 Fragment에서는 viewModel 선언 시 by activityViewModels 를 사용했던 기억이 있습니다. 현재 해당 강의를 실행해볼 환경이 아니여서 그런데 강의 코드대로 구동을 할 경우는 화면 회전 시 카운터 값이 0으로 초기화 되게 되나요? 아니면 LiveData를 사용할 경우 해당 viewModel 초기화를적용하지 않아도 데이터 값이 유지되게 되나요?
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
Fragment에서 ViewBinding과 DataBinding 초기화 차이가 궁금합니다.
ViewBinding과 DataBinding 각 강의에서 fragment에 binding을 초기화해주는 부분에 차이가 있습니다. ViewBinding의 경우에는 fragment의 생명주기로 인한 메모리 누수 방지를 위해 onDestroyView에서 binding = null 처리를 해주기 위해 _binding, binding을 따로 선언해주는 것으로 알고 있는데요. DataBinding의 경우는 ViewBinding과는 또 다른것인지요? 아니면 DataBinding의 경우 역시 private var _binding: FragmentTestBinding? = nullprivate val binding get() = _binding으로 초기화를 해주는 것이 메모리 누수 예방을 위해 더 좋은 것인지 궁금합니다.
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
최상단 변수 선언 관련하여 질문드려요
private var _binding과 private val binding을 따로 선언하는 이유가 뭔지 궁금합니다. getter을 이용해서 _binding을 binding에 묶어주었는데 이렇게 코드를 작성하는 이유가 있을까요?
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
Retrofit + ViewModelScope + RecyclerView + Glide 강의중에서
CustomAdapter.kt 파일내 Glide.with(context)이부분에서 빨간줄이 생기고 Unresolved reference: Glide라는 에러메세지가 생기네요build.gradle.ktsimplementation("com.github.bumptech.glide:glide:4.13.0'") annotationProcessor("com.github.bumptech.glide:compiler:4.14.2")
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
Retrofit 간단한 예제 변경 강의중에서
강사님 늘 감사드리고 건강하시고 부자되세요아래의 코드를 작성하여 실해하여도 에뮬레이터에 아무런 출력이 생기지 않는데 왜 그런지 ...자료는 git 에 올려두었습니다 https://github.com/dongguntechnology/RetrofitViewModelScope
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
LiveData 와 MutableLiveData 차이강의중에서
늘 수고많으신 개복치강사님 24년 갑진년에도 건강하시고 부자되세여 viewModel = ViewModelProvider(this).get(MainViewModel::class.java)위 코드에서 아래와 같은 오류가 발생하네요 Type mismatch: inferred type is MainViewModel but ViewModel was expected
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
Activity/Fragment ViewModel 공유 10분35초경에 fragment 에 viewModel선언
viewModel 선언하고MainViewModel by activityViewModel 이렇게 넣는코드있잖아요.혹시 구글이 공식적으로 이런식으로 액티비티와 프래그먼트간에 데이터를 공유할때 이렇게 써라라고 한 문서가있나요?되게 간편해보이는데, 제가 못찾고있는느낌이나서,저게아니라면 구글에서는 어떤 방식으로 activity와 fragment 에서 viewModel 에 대해서 공유하라는 제안이있는 공식문서 출처좀 알수있을까요??
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
안드로이드 테마 색상 오류
공부하는 프로젝트에 넣고 싶은 색상이 있는데 적용이 안됩니다. 테마를 Theme.Material3.DayNight.NoActionBar 이걸 적용중인데 회색으로 설정하면 연두색으로 나오면서 이상해서요 ㅠㅠㅠ 이거 해결 방법 없나요??ㅠㅠㅠㅠ Material3 이걸 바꾸면 머터리얼 디자인3가 자동으로 적용이 안되구요 ㅠㅠㅠ예를들면 #F0F0F0 컬러에 넣어두고 사용하면 연한 연두색으로 나옵니다
- 미해결[중급편] 친절한 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 } }
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
에러
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.DataBinding 과 data class 강의 듣고잇는중입니다xml에서 버튼에 myClick을 연결시킨 부분부터 애뮬레이터에서 버튼을 누르면 애플리케이션이 자동종료됩니다.코드를 똑같이 따라쳣는데 왜 이렇게 된건지모르겟습니다.에러내용입니다(코드내용 똑같다고 보면 될거같습니다.) <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="user" type="com.actual.jetpack_ex_databinding2.Person" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:id="@+id/test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text= "@{user.name}" android:textSize="50sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text= "@{Integer.toString(user.age)}" android:textSize="50sp" /> <TextView android:textSize="100dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.age > 30 ? `나이 많음` : `나이 적음`}" /> <Button android:text = "btn" android:onClick="myClick" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </layout> package com.actual.jetpack_ex_databinding2 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.View import androidx.databinding.DataBindingUtil import com.actual.jetpack_ex_databinding2.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding var testCount = 20 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_main ) // binding.test.text= "바뀐 텍스트" val person = Person("개복치", 20) binding.user= person fun myClick(view : View) { Log.d("MainActivity", "onClick") testCount++ val person = Person("개복치", testCount) binding.user = person } } } package com.actual.jetpack_ex_databinding2 data class Person ( val name : String, val age : Int )FATAL EXCEPTION: main Process: com.actual.jetpack_ex_databinding2, PID: 7731 java.lang.IllegalStateException: Could not find method myClick(View) in a parent or ancestor Context for android:onClick attribute defined on view class com.google.android.material.button.MaterialButton at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:506) at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:464) at android.view.View.performClick(View.java:7659) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1213) at android.view.View.performClickInternal(View.java:7636) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:30156) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8177) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) 그전까지는 잘 되는거로 보아 onClick="myClick" 부분이 문제인것같은데 잘 못찾겟습니다.
- 해결됨[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
ViewBinding 질문 있습니다.
시간은 ViewBinding 8분 50초입니다FragmentBinding 초기화하실 때private var _binding : FragmentTestBinding? = nullprivate val binding get() = binding!!이렇게 하셨는데요 액티비티에선private lateinit var binding : ActivityMainBinding 으로 하셨습니다저도 평소엔 이렇게 사용했는데 어떤 이유이신가요?보통 흔히 사용하는 get함수 역할이라고 생각하면 될까요?아니면 fragment에서 binding 초기화에러가 날 수 있기 때문인가요?궁금합니당.
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
fragment 이동시 data 초기화
fragment 1 에서 btn 을 눌러서 plus가 되면 value값이 증가를 하고, 이 증가한 상태에서 fragment 2로 갔다가,다시 fragment1 을 누르면 이전에 fragment가 나오는게 아니라 새로운 fragment가 생성이 되네요?transaction할 때 replace를 써서 그런것 같은데, fragment1 버튼을 누르면 새로운 fragment1이 아닌 기존 생성한 fragment1 화면으로 가는 것은 어떻게 해야 하나요?
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
CoroutineScope 질문
CoroutineScope 함수를 사용하여 Log.d를 찍어Start ~ End까지 찍어보는 예제에서순서가STARTENDCoroutineScope STARTapi1api2bp1bp2CoroutineScope END순차실행으로 START다음 CoroutineScope안의 내용을 다 실행 후 마지막에 END가 찍힐것으로 예상했는데 START 다음 END가 찍히는걸 보고 원인이 뭔지 궁금해서 질문했습니다.
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
뷰모델 질문
Retrofit 간단한 예제 변경+ RecyclerView 추가 강의에서 뷰모델에서 private var _mutableWordList = MutableLiveData<List<Post>>() val liveWordList: LiveData<List<Post>> 여기선 Post를 List로 해주는데 메인 액티비티 어댑터에서는 왜 CustomAdapter(it as ArrayList<Post>) ArrayList 로 감싸주나요??
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
바인딩 때 xml
바인딩을 사용할 때 xml을 layout 으로 감싸주는 이유가 뭔가요..?
- 해결됨[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
코루틴과 workmanager 순서 정하기의 차이점
안녕하세요Workmanager챕터의 workmanager+coroutine 부분을 듣다가 의문점이 생겨서 여쭤봅니다.WorkManager와 Coroutine을 결합했을 때로도 순서가 조절이 가능한데 workmanager를 사용하여 순서를 조절하는 이유가 있나요? 단순히 각자의 편의 혹은 취향대로 사용하는 것일까요 아니면 다른 부분이 또 있는 것인가요?
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
ViewModel 값
ViewModel을 이용하면 화면이 전환되며 fragment에서도 View가 destroy가 되어도 값이 유지가 된다고 보이는데 Fragment 2개를 전환시킬 때는 왜 유지가 되지는 않나요..? 강좌 챕터 View / ViewModel과 LiveData 사용해보기의 Fragment LiveData / LifeCycleOwner 부분입니다.
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
Retrofit 질문입니다.
MyApi.ktinterface MyApi { @GET("posts/1") suspend fun getPost1() : Post @GET("posts/{number}") suspend fun getPostNumber( @Path("number") number : Int ) : Post}강의: Retrofit 간단한 예제 변경시간 3분15초에서 suspend fun getPost1() : call<Post>에서 suspend fun getPost1() : Post로 수정하셨느데 무슨 차이가 있나요?
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
Activity / Fragment 의 ViewMode 질문있습니다.
Activity / Fragment 의 ViewModel 공유에서 아래코드 binding.fragmentTest.text = viewModel.getCount().toString()viewModel에 내장된함수 getCount()는 listbox에 데이터의 숫자를 문자로 변형해서 가져온것을 id fragmentTest의 text에 저장해준다로 이해 하면 되나요?
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
2강 질문이씁니다.
1.Fragment에서 ViewModel 사용 에서 7분 19초에 FragmentTestBinding이 import가 안되었을 때 xml 에서 layout을 추가하시던데요. 무슨관계가 있나요?xml에서 FragmentTestBinding이름을 가진 name도 없는데요.FragmentTestBinding가 클래스 이름 아닌가요? 2. Activity에서 ViewModel 사용 질문이요.화면 전환이 이루어지게 되면 Activity가 파괴(onDestroy)된 다음 다시 화면이 만들어지기 때문에(onCreate -> onresume) 기존의 데이터가 날아가는 것이다.라고 이해해도 되나요? 3. 동일하게 프래그먼트도 화면 전환이 이루어지게 되면 Activity가 파괴(onDestroy)된 다음 다시 화면이 만들어지기 때문에(onCreate -> onresume) 기존의 데이터가 날아가는 것이다.라고 이해해도 되나요? 4. Activity / Fragment 의 ViewModel 공유 5분34초에서요.DataBinding.setContentView(this,R.layout.activity_main) 변수를 2개 줬는데요인터넷에 찾아보니 아래와 같이 나오는데요.1. void setContentView(int layoutResID)2. void setContentView(View view)3. void setContentView(View view, ViewGroup.LayoutParams params)1. layout resource 를 인자로 받습니다. 이후 LayoutInflater 를 통해 inflate 되어지고 이후 최상단 뷰에 add 될 것 입니다.2. view 를 인자로 받습니다. 특정 view 로 content 를 구성 하고 싶을 경우 사용 될 것입니다.한가지 주의사항으로는 인자로 사용 될 view 의 width, height 를 별도로 지정하여 사용하고자 하여도, 함수 내부적으로 기본 LayoutParam 상의 width, height 를 MATH_PARENT 로 설정 하기 때문에 항상 MATH_PARENT 로 content view 가 설정 된다는 점입니다. 특정 크기로 지정하고 싶다면 별도의 LayoutParam 을 구성하여 3. 메소드를 사용해야 합니다.3. view 와 LayoutParam 을 인자로 받습니다. 2번에서 언급한 바와 같이 별도의 LayoutParam 으로 content view 를 구성하고 싶을 때 사용 되어 집니다.[출처] https://blog.naver.com/pistolcaffe/221285539895위설명에서 3번처럼 사용했다고 이해하면 되나요?추가적으로 인터넷에 찾아보니이어서 변수에 저장된 바인딩의 root 뷰를 setContentView에 전달한다.setContentView(변수.root) 이부분은 위 설명에서 2번처럼 사용한걸로 이해해도 되나요? 4. Activity / Fragment 의 ViewModel 공유 에서 addBackStack(null) 이나와서 인터넷에 찾아봣는데요.https://todaycode.tistory.com/131 글 읽어보니.addBackStack이 스택에 쌓아놓고 pause하는데요. . supportFragmentManager.beginTransaction().replace(R.id.frame_layout_main, MainFragment()).addBackStack(null) // replace 다음에 적어준다..commit() 예시코드 위를 보면 replace는 데이터를 버리는데 데이터를 버리고 난 후에 addBackStack(null) 을 쓰는게 뭔 효과가 있나요? 윗 코드가 잘못된건가요?