MutableLiveData는 Abstract Class 인 LiveData를 구현한 Public Class 위 말을 풀어 보면, 1. LiveData는 추상 클래스이므로 직접 생성할 수 없다. public abstract class LiveData { protected void postValue(T value) {} @MainThread protected void setValue(T value) {} //데이터 수정은 pretected 메서드를 구현해서 사용해야 한다. } val name : LiveData = LiveData() 위와 같이 직접 생성할 경우 아래와 같이 에러가 발생한다. cannot create an instance of an abstract class 반면에 MutableLiveDa..

위와 같이 아래 영역을 넘어가게 되어 하단에 버튼등을 고정 시킬 경우 보이지 않는 문제가 발생한다. 1. viewpager의 marginBottom="?actionBarSzie" 로 하게 될 경우 버튼은 보이지만 스크롤 할 경우 같이 올라가며 하단 빈 영역이 보이게 된다. 2. Tab과 CollapsingToolbarLayout 를 사용 할 경우 다른 레이아웃으로 감싸주면 스크롤 범위가 영역과 맞아져저 해결은 되지만, 탭의 구성이 찌그러지게 된다. 즉, CoordinatorLayout 아래 다른 레이아웃으로 감싸면 안됨. 3. 원인은 app:layout_behavior="@string/appbar_scrolling_view_behavior" 뷰 페이저의 스크롤링을 적용했기 때문에 하단으로 더 길게 스크롤..
아래 코드를 navController = Navigation.findNavController(this, R.id.fragment_navi_dashboard_host); 요렇게 바꾸어야 함 NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager() .findFragmentById(R.id.fragment_navi_dashboard_host); NavController navController = navHostFragment.getNavController();
벡터 문제도 아니고, xml 문제도 아니고, gradle 문제도 아니면, context 문제다. Drawable drawable = ContextCompat.getDrawable(getApplicationConetxt(), R.drawable.ic_arrow_back_white_24dp); 아래와 같이 this 로 바꿔야 한다. Drawable drawable = ContextCompat.getDrawable(this, R.drawable.ic_arrow_back_white_24dp);
Room 에서 DB 가 만들어지고, 초기화를 할 때 OnCreate() 에서 아래와 같이 워커를 불러서 작업을 하는데, val request = OnTimeWorkRequestBuilder().build() WorkManager.getInstance(context).enqueue(request) enqueue 에 작업을 넣으려고 하면 아래와 같이 요상한 에러가 난다. 아무리 인터넷을 뒤져도 답이 없다. E/AndroidRuntime: FATAL EXCEPTION: arch_disk_io_0 java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/work/impl/utils/futures/AbstractFuture; Caused by: java.l..
변경될 수 있는(mutable/var) 타입을 캐스팅 할 경우 문제가 생긴다. 이 경우에는 val 불변 타입으로 새로운 변수에 할당 한 뒤에 캐스팅을 해야 한다. private val plantDetailViewModel: PlantDetailViewModel by viewModels { InjectorUtils.providePlantDetailViewModelFactory(requireActivity(), args.plantId) } val binding = DataBindingUtil.inflate( inflater, R.layout.fragment_plant_detail, container, false ).apply { viewModel = plantDetailViewModel //error bea..
Repository의 Data가 변경 되었을 때 UI에 알리기 위해서는 ViewModel이 관찰을 하고 있어야 한다. UI(V)는 보통 onCreate()에서 VM을 생성하고, VM은 Repository를 생성한 뒤 M과 Dao를 통해 연결 되는데, 이 Dao를 LiveData로 구성하면 ViewModel이 지켜 볼 수(obsever) 있게 된다. 연결(MVVM) onCreate/onCreateView 실행이 되면서 viewModel 생성 작업과 이후 연결 작업이 실행 된다. Fragment.kt private val plantDetailViewModel: PlantDetailViewModel by viewModels { InjectorUtils.providePlantDetailViewModelFacto..
Data Binding으로 View와 직접 데이터를 연결 해 놓으면, 네트워크, DB, 다른 View의 변경 작업만으로 해당 뷰가 사라지고 나타나게 할 수 있다. 자동으로 작업이 되게 하려면 View 는 observe 작업을 통해 viewModel -Model 과의 연결을 해 놓아야 한다. 식물 리스트에서 나의 정원으로 담기를 해 놓은 것이 없다면, 리사이클러 뷰를 아예 보여주지 않는다. @BindingAdapter("isGone") fun bindIsGone(view: View, isGone: Boolean) { view.visibility = if (isGone) { View.GONE } else { View.VISIBLE } } Android AAC JetPack Sunflower 이 글은 코모가 ..