fragment에서 Toast 메시지를 띄우거나 부모 액티비티의 함수를 호출할 때, context/activity가 필요한 경우가 있다. 하지만 Fragment 클래스에는 context가 포함되어 있지 않기 때문에 어떻게 해야할지 곤란했다. - context 얻기 class CustomFragment : Fragment() { private lateinit var mContext: Context override fun onAttach(context: Context) { super.onAttach(context) mContext = context } } fragment 생명주기 가장 처음에 호출되는 onAttach의 인자로 context가 들어옴을 발견했다. 이는 부모 액티비티의 context로, 이 co..
API 33 이후부터 onBackPressed()가 deprecated 되었다. onBackPressed()는 사용자가 뒤로가기 버튼을 누를 때 호출되는 함수로, 주로 뒤로가기 버튼으로 액티비티/앱을 빠져나가는 것을 막을 때 사용했다. 이 함수를 대체할 수 있는 onBackPressedCallback을 알아보려고 한다. onBackPressedCallback은 뒤로가기 버튼이 눌렸을 때 호출되는 콜백이다. 이 콜백을 onBackPressedDispatcher에 추가하면, 버튼이 눌릴 때마다 지정해준 onBackPressedCallback이 호출된다. 1. onBackPressedCallback 생성 뒤로 가기 버튼이 눌렸을 때 어떤 작업을 수행할지 작성 val callback = object : OnBa..
Activity와 Fragment 간에 데이터를 전달하는 방법은 여러가지가 있겠지만, 여기서는 리스너를 활용하는 방법을 작성하려고 한다. 프래그먼트에서 생성하거나 받아온 데이터를, 자신을 호출한 액티비티에서 처리해야 할 경우 사용할 수 있겠다. 1. ListenerInterface 생성하기 interface CustomDialogInterface { fun onAddButtonClicked(date: String, contents: String, posted: String) } 리스너가 한개인 인터페이스를 생성했다. 내 경우에는 custom dialog가 fragment가 되고, add button을 클릭하면 액티비티에 데이터를 전송하는 방식이었기 때문에 인터페이스명/함수명을 이런 식으로 작성했다. 매개..
AlertDialog.Builder(this) .setTitle("Title") .setMessage("Message") .create() .show() 안드로이드에서 제공하는 기본 다이얼로그를 사용하려면 위와 비슷하게 작성하면 된다. 하지만 다이얼로그의 ui를 변경하거나 특정 로직을 더 넣고 싶다면 커스텀 다이얼로그를 구현해야 한다. 커스텀 다이얼로그를 구현하는 방법은 크게 두 가지가 있다. FragmentDialog를 확장하는 방법과, manifest의 theme를 dialog로 변경하는 방법이다. FragmentDialog를 상속받아 구현하는 방법이다. FragmentDialog도 Fragment의 일종이므로 Fragment의 생명주기를 활용할 수 있다. Dialo..
데이터 바인딩 뷰 바인딩과 동일하게 findViewById() 호출을 대체할 수 있도록 안드로이드가 지원하는 라이브러리다. 뷰 바인딩과 다른 점은, 액티비티의 데이터와 레이아웃(xml)의 뷰가 바인딩 될 수 있다는 것이다. 즉, 액티비티의 데이터가 변경되면 ui상의 뷰가 자동으로 변경되는 기능을 제공한다. 이를 액티비티 코드 내에서 구현하는 것이 아닌, xml 코드 내에서 구현할 수 있어 코드량이 줄어든다. (declarative 레이아웃 작성) 또한 xml 파일만 보고도 View에 어떤 데이터가 들어가는지 파악할 수 있기 때문에 가독성이 좋아진다. 1. build.gradle (module) android { dataBinding { enabled = true } } module/app 수준의 빌드 파..
RecyclerView ListView와 동일하게 데이터 세트를 개별 아이템으로 구성하여 화면에 출력하는 ViewGroup 중 하나다. 여러 데이터를 스크롤할 수 있게 화면에 표시하는 위젯이다. ListView와 다른점 ListView는 리스트가 갱신될 때마다 아이템 뷰를 새로 구성해야 한다는 단점이 있다. 반면에 RecyclerView는 이름에서 알 수 있듯이 개별 아이템을 재활용한다. 항목이 스크롤되어 화면에서 벗어나더라도 개별 뷰들을 제거하지 않고, 스크롤된 새로운 아이템의 뷰를 재사용하기 때문에 성능이 개선된다. 필요한 클래스 1. RecyclerView 데이터 세트를 화면에 출력하는 ViewGroup 2. ViewHolder 리스트의 개별 아이템은 ViewHolder 객체로 정의된다. Recyc..
다이얼로그를 커스텀해서 사용하면, match_parent를 해도 화면에 꽉 차지 않는 경우가 있다. 커스텀 다이얼로그의 기본 width, height 값이 0이기 때문이다. 이 경우 setContentview() 호출 후에 아래의 코드를 호출하면 해결된다. dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) 다이얼로그의 전체 크기를 ViewGroup.LayoutParams.MATCH_PARENT로 바꾸어주는 코드다.
코틀린으로 안드로이드 프로젝트를 구현하던 도중 아래와 같은 오류가 발생했다. 나같은 경우에는 ViewModel.Factory 인터페이스를 구현한 부분에서 생긴 오류였다. Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option android { kotlinOptions { freeCompilerArgs = ['-Xjvm-default=compatibility'] } } 모듈 build.gradle의 android-kotlinOptions 안에 freeCompilerArgs 한줄을 넣어주면 해결된다! 서치해봐도 잘 나오질 않아서 멘탈 터질뻔 했다.. 참고 https://stackoverf..