분류 전체보기 411

테스트 코드 작성 junit assertEquals

안드로이드 테스트 코드 작성 작업중 StringUtil에 함수를 하나 만들었다. PR에 StringUtil함수 추가시에는 테스트 코드도 넣어주었으면 좋겠다고 하여 테스트 코드를 추가 하였습니다. 자바로 작성되어있어서.. 자바로 했다. 1. 테스트 클래스 파일을 만든다. 2. 함수를 실행하여 결과 확인 public class StringUtilTest { @Test public void replaceCurrentAppSchemeAndDomain() { assertEquals(StringUtil.함수(), "결과값"); } } 함수옆에 보면 실행하는 표시가 있다! 단정 메소드(assert method) JUnit에서 가장 많이 이용되는 단정(assert) 메소드입니다. 단정 메서드로 테스트 케이스의 수행 결..

안드로이드 2023.10.13

binding시 release 모드에서 에러가 발생할 때

릴리즈모드 바인딩 에러와 관련하여 몇 가지 테스트를 통해서 내용 정리를 했습니다. 1. Release 모드에서 VIewBinding class를 찾지 못해서 에러가 발생 -> 왜 찾지 못할까? ... 최적화(minifyEnabled)옵션이 true이면 binding 파일이 사라진다. 2. 최적화에서 binding 파일이 사라지지 않으려면 어떻게 해야 할까? -> layout 태그를 명시적으로 추가하거나, binding 파일을 사용하는 화면에서 binding에 실제 접근을 하면 된다. 결론 : layout 태그도 없고, Fragment 소스상에서 binding에 접근도 하지 않아 최적화 과정에서 참조 없는 클래스로 판단, 자동으로 삭제되어 문제가 발생. 앞으로, layout 태그를 명시적으로 추가하자!!!..

컴포즈(compose) 컴포저블 함수 상태 관리

컴포저블 함수 상태 관리 상태를 갖지 않는 컴포저블과 상태를 갖는 컴포저블 간의 차이점 이해 언제 어떠한 것을 선택할지 살펴본다. 상태를 갖거나 갖지 않는 컴포저블 함수 이해 상태 : 시간이 흐름에 따라 변하는 데이터 UI는 항상 현재 데이터를 보여줘야만 한다는 것이 중요 따라서 값이 변경되면 반드시 UI에 알려야 함. 옵저버블 타입을 사용 State는 기본 인터페이스로, value라는 이름을 갖는 프로퍼티에 특정 타입의 값을 저장하는 객체인 값 홀더(value holder)를 정의 컴포저블 함수가 실행되는 동안 value가 변경될 때마다 재구성될 것이다. 내부적으로 RecomposeScope 인터페이스가 값의 변경 사항을 구독하고 있을 것이기 때문 값이 변경될 수 있게 하려면 MutableState의 ..

컴포즈(Compose) UI 요소 배치

미리 정의된 레이아웃 사용 고려해야 할 세가지 축 수평(Horizontal) 수직(Vertical) 스택(Stacked) Row() - 가로 Column() - 세로 Box() & BoxWithConstraint() - 콘텐츠를 맨위에 쌓음. CheckBox() - 현재 상태(checked)와 선택하면 호출되는 람다(onCheckedChange)를 받는다 함수 작성시점에 레이블 전달할 수 없다. 대신 CheckBox(), Text()를 Row()안에 포함해 유사한 결과물 만들 수 있다. CheckBoxWithLabel()은 MutableState을 받는다. onCheckedChange 내부에서 값이 변경되면 다른 컴포저블 함수를 재구성해야 하기 때문이다 제약 조건을 기반으로 하는 레이아웃 생성 코드를 단..

컴포즈(Compose) 컴포즈 핵심 원칙 자세히 알아보기

잿팩 컴포즈가 의존하고 있는 핵심 원칙을 검토 컴포저블 함수 자세히 살펴보기 컴포저블 함수의 구성 요소 @Composable 어노테이션을 포함하는 코틀린 함수 컴포즈 컴파일러에 해당 함수가 데이터를 UI로 변환 한다는 것을 알림 코틀린 함수 시그니처 선택 사항인 가시성 변경자(private, protected, internal 또는 public) fun 키워드 함수명 매개변수 목록 또는 선택적 기본값 채택 선택 사항인 반환 타입 코드블록 컴포저블 함수명은 파스칼(PascalCase) 표기법을 사용 대문자로 시작하지만 나머지 문자는 소문자로 나타낸다. 두 단어 이상으로 되어있다면 이름은 명사(Demo) 서술형 형용사를 접두어로 갖는 명사(FancyDemo)여야 한다. 다른 코틀린 함수와는 다르게 컴포저블 ..

컴포즈(Compose) 선언적 패러다임 이해

전통적인 뷰 기반 접근 방식은 컴포넌트와 클래스에 중점을 뒀던 것에 비해 새로운 프레임워크는 선언적 접근 방식을 따른다. 안드로이드 뷰 시스템 살펴보기 기존 접근 방식 컴포넌트 트리를 정의하고 런타임에서 변경하는 것 레이아웃 파일은 계층구조(트리)를 정의 레이아웃 파일 인플레이팅 두가지 문제 변수를 초기화 하기 전에 접근하면 런타임에서 크래시 컴포넌트 개수가 많아지면 코드가 비대해짐 두 번째 문제를 해결하고자, 컴포넌트 참조를 계속 유지해야 하는 작업을 덜어주고자 구글은 뷰 바인딩 기능을 제공 일반적인 UI 프레임워크를 명력적이라고 하는 이유 UI는 XML파일로 정의 UI는 런타임 단계에서 컴포넌트 트리로 인플레이트된다. UI를 변경하려면 연관된 모든 컴포넌트의 속성을 수정해야만 한다. UI 요소가 화면..

컴포즈(Compose) 앱 빌드

젯팩 컴포즈 공부를 시작하였습니다. 책 : 젯팩 컴포즈로 개발하는 안드로이드 UI 안드로이드 개발당시 처음에는 앱이 작았고 소수의 디바이스만 지원하면 됐기 때문에 문제없이 잘 동작했다. 점점 새 기능 및 화면 크기등 폼 팩터가 각각 다르게 출시되며 복잡성이 급격히 증가. 대부분의 문제는 명령적 접근 방식 Ui툴킷 방식에서 발생. 해결책은 패러다임을 전환하는 것. 웹 프레임워크 : 리액트 (선언적 접근 방식) 플러터 또는 SwiftUI도 뒤 따랐다. 잿팩 컴포즈는 구글이 안드로이드용으로 만든 선언적 UI 프레임워크다. 코틀린 전용 컴포저블 함수와 인사 @Composable fun Welcome() { Text( text = stringResource(id = R.string.welcome), style =..

[Android] 첨부파일시 여러 파일형식 제어

첨부파일 작업중에 여러형식의 파일을 제어 해야한다. 바쁘신분들은 바로 이거 참조 구글 mime type Link Intent에 type을 */* 주고 EXTRA_MIME_TYPES에 적용할 MimeType들을 String배열로 넣어주면 된다. type = "*/*" val mimeTypes = arrayOf("각 MimeType", "각 MimeType") putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) MIME TYPE을 인터넷으로 검색 했지만 잘 나오지 않는 파일형식들도 있었다! 그래서 파일 하나하나 로그를 찍어가면서 살펴 보았습니다. - Mime Type 가져오기 fun getMimeType(uri: Uri): String? { var mimeType: String?..

안드로이드 2023.08.10

도쿄여행 인천 -> 도쿄(나리타) -> 긴자이동

도쿄여행 3박4일 일정 (23년 3월, 4월) 저번에 준비편은 작성하였으니 그 부분은 도쿄 나리타 3박4일 여행 - 준비편 봐주시면 됩니다! 3박4일 일정짜기 어려운 초보분들도 참고하기 아주 좋습니다! 저는 2일차에 도쿄 디즈니랜드를 갈 예정이라 숙소는 Hotel Vista Tokyo Tsukiji 로 잡았습니다. 인천공항 인천공항에서는 그렇게 사람이 많지 않아서 여유롭게 면세점도 구경하고 출국하였습니다! 식사는 인천공항에서 플레이보6이란 식당에가서 간단히 먹었습니다! 도쿄(나리타) 공항 아무래도 코로나때문에 비짓재팬을 하는게 좋을것 같습니다. (입국심사도 좀 더 빠름) 비행기에서 내리자마자 빠르게가도 줄은 서야합니다.(사람이 많았음! 2시간 예상) 저가 항공을 타서 2터미널에서 내려가지고 알아본 리무진..

여행 2023.08.02