55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
[Retrofit 간단한 예제 변경 + RecyclerView 추가] 에 databinding 추가해 보았습니다.
안녕하세요, 좋은 강의 만들어 주셔서 감사합니다. [Retrofit 간단한 예제 변경 + RecyclerView 추가] 강의 말미에 말씀해주신대로 recyclerview에 databinding 을 추가해 보았습니다. (Android view에 대한 접근 강의 마지막 챕터 databinding + adapter 참고해서 )화면에 데이터가 나오긴 하는데 제대로 적용된것이 맞는지 궁금합니다. + 추가적으로, MainActivity에서 databinding이용해서 viewModel 데이터 결합을 해줘야 하는건지 궁금합니다. (아직 dataBinding 다른 라이브러리와 함께 사용할때 헷갈리는 부분이 많아서ㅠ )답변 주시면 감사하겠습니다. 변경된 부분은 1. text_row_itemCustomAdatperactivity_main.xmlMainActivitytext_row_item : : <layout> 감싸고 data class Post로 데이터 결합 <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="myData" type="com.example.a04withrecyclerview.model.Post" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/myText" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{myData.title}" android:textSize="20dp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="******" /> </LinearLayout> </layout>CustomAdapterMyviewHolder dataBinding으로 수정class CustomAdapter(private val dataSet : ArrayList<Post>) : RecyclerView.Adapter<CustomAdapter.MyViewHolder>() { class MyViewHolder(binding : TextRowItemBinding) : RecyclerView.ViewHolder(binding.root){ val text : TextView = binding.myText } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { //val view = LayoutInflater.from(parent.context).inflate(R.layout.text_row_item, parent, false) val view = DataBindingUtil.inflate<TextRowItemBinding>(LayoutInflater.from(parent.context), R.layout.text_row_item, parent,false) return MyViewHolder(view) } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { holder.text.text = dataSet[position].title } override fun getItemCount(): Int { return dataSet.size } }activty_main : <layout> 감싸기<layout> <androidx.constraintlayout.widget.ConstraintLayout 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" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent"/> </androidx.constraintlayout.widget.ConstraintLayout> </layout>MainActivity: dataBinding 적용class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding private lateinit var viewModel : MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() binding = DataBindingUtil.setContentView(this, R.layout.activity_main) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } viewModel = ViewModelProvider(this).get(MyViewModel::class.java) viewModel.getPostAll() //val rv = findViewById<RecyclerView>(R.id.rv) viewModel.liveWordList.observe(this){ val customAdapter = CustomAdapter(it as ArrayList<Post>) binding.rv.adapter = customAdapter binding.rv.layoutManager = LinearLayoutManager(this) } } }
- 미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
Navigation Data Transfer Safe Args 강의중에서
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View? { val view = inflater.inflate(R.layout.fragment_blank1, container, false) val action = BlankFragment1Directions.actionBlankFragment1ToBlankFragment2("ABCDE")위의 코드중에서 "ABCD" 부분에서 빨간줄이 생기고 오류가 나네요 ... 왜 그럴까요 ???소스코드는 아래 GITHUB 에 올려두었습니다https://github.com/dongguntechnology/NaviDataTransfer
- 미해결[중급편] 친절한 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로 수정하셨느데 무슨 차이가 있나요?