목록전체 글 (119)
기록
개발 과정 중 navigation으로 fragment를 교환하는 작업을 할 때 다음과 같은 오류를 만난 적이 있을 지도 모릅니다. 잘못된 action을 참조하여 이러한 오류가 발생했다면 해당 액션을 올바르게 수정하여 어렵지 않게 에러를 해결할 수 있습니다. 이 포스트에서는 대부분의 모든 action이 정상적으로 수행되나, 때때로 해당 crash가 발생하며 코드상에서 명확한 원인을 찾기 어려운 경우에 대해 기술합니다. 문제 원인 이 문제는 다음과 같은 이유로 navigation action 호출 이벤트가 연속적으로 두 번 이상 트리거될 때 나타납니다. 1. 네트워크 응답 콜백, 센서 및 인터넷 연결 콜백과 같은 non-user에 의해 트리거된 콜백 2. 해당 이벤트를 호출하는 버튼 클릭, 뷰 이벤트와 같은..
https://school.programmers.co.kr/learn/courses/30/lessons/118666 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 요즘 유행하는 MBTI 관련 문제여서 재미있게 풀었다. 문제 접근 - 동점일 때 사전순 처리를 어떻게 할 것인가? class Solution { fun solution(survey: Array, choices: IntArray): String { var answer = "" val standardZeroJipyo = mapOf(0 to "RT", 1 to "CF", 2 to "JM", 3 to ..
앱을 쓰다 보면 editText를 눌러 키보드를 올린 상태로 입력한 뒤, 바깥 부분을 아무데나 누르면 키보드가 내려가는 걸 볼 수 있다. 이 처리를 구현하고 싶다면 먼저 아래 메서드를 생성한다. void hideKeyboard() { InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } 프래그먼트를 사용 중이라면 아래 코드를 사용한다. private void h..
현재 만들고 있는 노트 앱에서 데이터베이스의 note data를 fetch하는 동안 프로그레스 바를 돌렸다. 이번에 유저 기능을 추가하면서 로그인/회원가입 단계에서도 데이터를 가져올 때 프로그레스 바를 돌리고 싶었다. 이렇게 같은 레이아웃을 반복해서 사용할 때는 xml에서 include라는 태그를 사용하면 레이아웃을 재사용할 수 있다. 사용법 먼저 재사용할 프로그레스바를 새로운 레이아웃 파일로 빼내고, 여러곳에서 프로그레스바를 돌릴 조건을 전달받기 위해 isVisible이라는 변수를 새로 정의했다. 그리고 해당 레이아웃을 사용할 xml 파일에 다음과 같은 내용을 추가한다. ... ... 위와 같이 include 태그의 layout 속성에 재사용하려는 레이아웃 파일 이름을 기술한다. 그리고 bind 속성으..
LiveData Android Studio 3.1 이상부터는 LiveData와 ViewModel이 데이터바인딩과 함께 작동한다. (Databinding Supports for ViewModel and LiveData) binding.viewModel = viewModel binding.setLifecycleOwner = this 위와 같이 xml 레이아웃에 뷰모델과 LifecycleOwner을 바인딩야하면 xml에 바인딩한 LiveData를 제대로 관찰할 수 있다. 따라서 xml에 바인딩 수식으로 ViewModel과 LiveData에 대한 참조를 표현할수 있다. 데이터바인딩을 사용하면 더 이상 UI단에서 Observer를 수동으로 설정할 필요가 없다. 따라서 LiveData Observer 코드를 만드는..
val menuHost: MenuHost = requireActivity() menuHost.addMenuProvider( object : MenuProvider { override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.selected_note_menu, menu) } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { when (menuItem.itemId) { R.id.delete_menu -> { viewModel.deleteNote(note) navController.navigateUp() } else -> return ..
override fun onMenuItemSelected(menuItem: MenuItem): Boolean { when (menuItem.itemId) { R.id.delete_menu -> { viewModel.deleteNote(note) this@SelectedNoteFragment.findNavController().popBackStack() } else -> return false } return true } java.lang.IllegalStateException: Fragment SelectedNoteFragment{e2fb287} (9027fbbf-8601-4b62-ab29-fdbea88a370d) not associated with a fragment manager. findNavCon..
https://school.programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 접근 방식 - lottos 리스트의 요소가 win_nums 리스트 요소 안에 몇개 있는가? - 0의 경우 어떻게 처리할 것인가? class Solution { fun solution(lottos: IntArray, win_nums: IntArray): IntArray { var answer = intArrayOf(0, 0) for(l in lottos) { if(win_nums.contain..
import kotlinx.coroutines.launch import kotlinx.coroutines.* fun main() { val api = NamesApi() val namesJson = api.getNames(); println("----- ORIGINAL JSON NAMES:") println(api.getNames()); val names = nameFromJson(namesJson); println(); println("----- CONVERTED NAMES:") println(names); } fun nameFromJson(namesJson: List): List { return namesJson.filter { nameJson -> nameJson.lastName[0] == 'K' ..
1. 생성자 문법 class SongListAdapter : ListAdapter(SongDiffCallback()) { ... } class SongDiffCallback : DiffUtil.ItemCallback() { ... } SongListAdapter 클래스 안에 SongDiffCallback이라는 클래스가 ListAdapter 클래스의 생성자로 들어갔다. 그런데 SongListAdapter 코드 블럭 안에 SongDiffCallback가 쓰이지 않았다. 왜 들어간 것인가? ListAdapter 클래스 안에서 쓰였기 때문! 이해를 돕는 예제 코드를 첨부한다. fun main() { //val korean = Human(Korean()) val korean = KoreanPerson() kore..