분류 전체보기
-
[안드로이드] GridView 사용법카테고리 없음 2024. 4. 3. 10:34
xml 사용법 android:numColumns를 설정하여 한 줄에 들어갈 요소들을 설정할 수 있습니다. 왼쪽은 numColumns가 3일 때, 오른쪽은 6일 때 코드 작성 방법 이제 이미지들을 Grid에 뿌려주기 위해서 BaseAdapter라는걸 사용해야 합니다. convertView가 ImageView가 아닐 때 ImageView를 새로 생성하고 이미지를 설정하여 넘겨줍니다. 여기서 adjustViewBounds를 볼 수 있는데 이 설정을 활성화하면 한 줄에 얼만큼 들어가냐에 따라 크기를 자동으로 조절합니다. 그리고 액티비티에서 GridView를 찾아 어댑터를 연결해주어야 합니다. 어탭터를 잘 연결해주었다면 위처럼 보이게 될겁니다. (adjustViewBounds를 비활성화한 사진은 아래) data ..
-
[Jetpack Compose] AnimatedVisibility 사용법카테고리 없음 2024. 3. 29. 21:33
사용법 AnimatedVisibility의 인자들을 설명해보겠습니다. visible에는 isVisible를 remember을 사용한 변수로 둬서 isVisible이 바뀔 때마다 visible이 설정되도록 제어합니다. enter와 exit에는 각각 fadeIn과 fadeOut 함수를 사용하여 대입해주는데 여기서 tween이란걸 볼 수 있습니다. tween은 곡선 애니메이션을 제어하는 함수라고 생각하면 될 것 같습니다. tween의 durationMillis는 fadeIn과 fadeOut이 걸리는 시간을 의미하고 easing은 시작부터 끝까지 실행될 곡선 애니메이션을 설정하는 인자입니다. @Composable private fun Animation() { Column( horizontalAlignment =..
-
[Jetpack Compose] 커스터마이징 가능한 TextField카테고리 없음 2024. 3. 29. 10:31
입력을 받기 위해 무엇을 사용해야 하는가 xml에선 EditText를 사용했었는데 Compose에선 TextField를 사용하면 된다. Compose의 TextField는 material3의 디자인을 기반으로 하는 기능이다. (솔직히 아래 디자인이 구려서 쓰고 싶지 않다..) 디자인 문제를 해결하기 위해 BasicTextField를 사용해볼 것이다. 사용법 일단 아주 간단한 기능만 작동되는 입력 칸을 만들었다. remember와 mutableStateOf를 사용하여 검색한 값을 저장하도록 하였다. @Composable private fun PlayerSearchBar() { var searchInput by remember { mutableStateOf("") } BasicTextField( value ..
-
[Jetpack Compose] 크기가 자동 조정되는 Text카테고리 없음 2024. 3. 27. 20:38
사용 이유 개인 프로젝트를 하면서 글자 길이가 긴 것들만 일부 줄여서 사용하기 귀찮아서 구글링을 하며 만들어보았다. 작동 방식 onTextLayout이 글자의 레이아웃이 계산될 때 호출되는 콜백이다. 여기서 it.didOverflowWidth를 사용해서 체크하여 위에 선언해 두었던 newFontSize에 0.95를 곱하여 줄인다. (didOverflowWidth는 가로 길이가 넘어갈 때 true를 반환하는 프로퍼티이다.) 그렇게 가로 길이가 초과되지 않을 때까지 콜백이 반복되어 글자가 줄어들게 된다. @Composable fun Text( modifier: Modifier = Modifier, text: Any, fontSize: TextUnit, textAlign: TextAlign? = null, f..
-
[패턴] 전략(Strategy) 패턴카테고리 없음 2024. 3. 26. 11:28
TMI 최근에 코드를 짜는데 전략 패턴이 생각나서 전략 패턴을 적용하여 코드를 짜봤다. 아주 간단한 기능이어서 굳이 쓸까 싶었지만 한번 쯤 사용하면 이해되는데 도움이 될거 같아서 사용해봤다. 언제 사용 하는지? 같은 결과를 반환하는 동작이지만 내부 코드가 다를 때 동작이 런타임 중에 실시간으로 교체되어야 할 때 전략 패턴을 사용하지 않은 예시 코드 enum class Type { ITEMSADDER, MATERIAL } data class Tool( private val id: String ) { // Enum을 이용하여 비교하기 때문에 추후에 타입 추가가 필요하면 Tool 클래스를 수정해야할 것이다. fun isTool(itemStack: ItemStack, type: Type): Boolean { r..
-
[안드로이드] MVVM 패턴카테고리 없음 2024. 3. 26. 10:45
장점 View와 Model이 완전히 분리되어 독립성을 유지할 수 있고 유닛 테스트가 용이하다. (기존 MVC 패턴은 여러 곳에 작업 요청을 뿌렸다면, MVVM 패턴은 요청한 작업의 흐름이 순차적으로 진행된다.) 단점 데이터 바인딩이 필수이며 복잡해질수록 Controller만큼 ViewModel이 처리해야할 작업이 많아진다. 작동 방식 이용자의 입력이 View를 통해 들어온다. View에 입력이 들어오면 ViewModel에 입력을 전달한다. ViewModel은 전달받은 입력을 바탕으로 Model에 데이터를 요청한다. Model은 ViewModel의 요청을 응답하여 데이터를 넘긴다. ViewModel은 받은 데이터를 저장하고 View에 넘겨준다. View는 받은 데이터를 화면에 표시한다. 예시 코드 (이전에..
-
[안드로이드] Button카테고리 없음 2024. 3. 22. 20:56
버튼을 사용하는 방법 두가지 1. 클래스에서 findViewById로 버튼을 불러와서 setOnClickListener 함수 연결하기 class SignInActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_sign_in) val button: Button = findViewById(R.id.sign_in_button) button.setOnClickListener { // TODO } } } 2. xml에 있는 Button에 onClick에 함수 연결하기 class SignInAct..
-
[안드로이드] xml의 include 태그카테고리 없음 2024. 3. 21. 10:20
include xml에서 반복되는 레이아웃을 재사용하기 위해 사용하는 태그이다. 아래 사진은 activity_sign_in.xml, activity_sign_up.xml이다. 아이디 부분만 예시로 들어보자면 완전히 겹치는걸 알 수 있다. include 사용법 아래처럼 id_group.xml로 중복되는 레이아웃을 따로 분리한 후 activity_sign_in.xml, activity_sign_up.xml에 적용시키면 중복되는 레이아웃을 줄일 수 있다. (위/아래 코드를 생략하니 사실상 거의 같은 코드로 보인다.)