Development

- 안드로이드에는 위젯 인스턴스 하나마다 고유한 ID를 가진다. 이게 AppWidgetId이다. - 바탕화면에 똑같은 위젯 두 개를 생성해도 개별 ID는 다르다. 이를 통해 서로 바라보는 데이터를 달리할 수 있다. - 예를 들어 A-1 위젯에서는 Key + A-1-AppWidgetId로 1번 데이터를, A-2 위젯에서는 Key + A-2-AppWidgetId로 2번 데이터를 저장하고 렌더링 할 수도 있는 것이다. - 기존 XML RemoteViews 방식 위젯에서는 아래와 같이 AppWidgetId 조회가 가능하다.override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntAr..
- 요즘 바이브 코딩이라는 말이 정말 많이 들린다. - 바이브 코딩(Vibe Coding)이란 개발자가 생성형 AI의 도움을 받아 코드를 작성하는 행위를 일컫는 신조어로 프로그래밍을 할 때 사전에 엄밀한 논리나 설계를 바탕으로 하지 않고 직감과 느낌에 의존한다는 의미로 ‘바이브’ 코딩이라는 이름이 붙었다. - Cursor, Windsurf 등등 종류가 많은데 안드로이드 스튜디오에서 실행하기 쉬운 WindSurf로 진행해 봤다.https://windsurf.com/editor Windsurf Editor | Windsurf (formerly Codeium)Tomorrow's editor, today. Windsurf Editor is the first AI agent-powered IDE that keep..
- 단색이 아닌 특정 이미지를 활용하여 View의 테두리를 붙여서 그려줘야 하는 경우가 있었다. - 이미 그려야하는 라인의 각 지점에 대한 좌표 값들이 프로젝트에 구성되어 있었기 때문에 그에 따라 비트맵을 붙여주기만 하면 되었다.val measure = PathMeasure(path, false)val length = measure.length - PathMeasure(path, forceClosed: Boolean)는 Android에서 Path의 길이와 경로 상의 점, 방향 등을 측정할 수 있게 해주는 클래스다. 이를 통해 그려야 하는 라인 상의 정확한 위치와 방향을 찾을 수 있다. - 그리기 전에 경로 길이를 측정해놓고, 이후 일정 거리마다 지점에 비트맵을 붙일 것이다. - forceClosed: B..
- Glance에서 Image 컴포저블 자체에 Alpha 값을 적용할 수는 없다. 그래서 애초에 ImageProvider에 리소스를 넘길 때 알파 값이 적용된 리소스여야 한다. - 알파값 적용된 비트맵은 아래 확장함수를 구현하여 기존 비트맵에서 알파를 적용한 비트맵을 다시 그리도록 했다.fun Bitmap.withAlpha(alpha: Float): Bitmap { val result = createBitmap(width, height) val canvas = Canvas(result) val paint = Paint().apply { this.alpha = (alpha * 255).toInt() } canvas.drawBitmap(this, 0f, 0f, paint) retu..
- 구글 플레이 스토어 업로드 심사 중에 아래와 같은 이슈 발생으로 거절당했다.Exception java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at androidx.fragment.app.FragmentManager.checkStateLoss (FragmentManager.java:1852) at androidx.fragment.app.FragmentManager.enqueueAction (FragmentManager.java:1892) at androidx.fragment.app.BackStackRecord.commitInternal (BackStackRecord.java:341) at ..
- 결제 모듈 라이브러리를 업데이트하라는 알림이 와서 업데이트했더니 코틀린 버전도 2.0으로 업그레이드해야 호환이 된다고 한다. - 그래서 프로젝트 수준 Gradle에 선언해 둔 코틀린 버전을 일단 2.0.0으로 업그레이드했다.buildscript { ext.kotlin_version = '2.0.0' ... - 코틀린 버전 업그레이드에 따라 Compose 컴파일러 버전에 대해서도 변경해주어야 한다.- Compose 컴파일러가 Gradle plugin 방식으로 변경되었다. - 원래는 버전 카탈로그를 통해 다음 링크에 나온 것처럼 업데이트를 할 수 있는데, 현재 프로젝트 상태가 많이 상이하여 임시 대응했다.https://developer.android.com/develop/ui/compose/c..
- ShortCut 기능은 원터치 바로 가기 기능이라고 볼 수 있다.- 이렇게 바탕화면에서 특정 앱 아이콘을 롱클릭하면 몇 가지 옵션이 표시되는 것이다. 그리고 클릭 시, 해당 화면으로 바로 이동할 수 있다. - 이를 정적 바로가기 라고 명칭하는데, 동적 바로가기도 존재한다. 다음 문서를 참고.https://developer.android.com/develop/ui/views/launch/shortcuts/creating-shortcuts?hl=ko#dynamic 바로가기 만들기 | Views | Android Developers이 페이지는 Cloud Translation API를 통해 번역되었습니다. 바로가기 만들기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. ..
- 정규 표현식 같은 경우에는 스키마에 대한 커스터마이징 또는 링크 효과에 대한 커스터마이징이 필요하다면 사용할 수 있는데 단순히 링크 활성화만 되어야한다면 authLink 기능을 사용할 수 있다.descriptionView.autoLinkMask = Linkify.WEB_URLSdescriptionView.movementMethod = LinkMovementMethod.getInstance() - WEB_URLS 말고 PHONE_NUMBERS 등 몇가지 형식이 존재한다. - Compose Text에는 autoLink는 없는 것 같다. SpannableString 개념이 필요할듯
- 간혹 전체 텍스트에 url이 중간에 섞여있고, 이 부분을 링크 처리하여 사용자가 바로 외부로 연결할 수 있도록 구현이 필요할 때 아래와 같은 함수를 구성해서 사용한다.fun setHyperlinkedText(textView: TextView, rawText: String) { val spannable = SpannableString(rawText) val urlRegex = Regex("""https?://[^\s]+""") val matches = urlRegex.findAll(rawText) for (match in matches) { val url = match.value val start = match.range.first val en..
- XML 파일을 기반으로 Ripple을 구현하는 과정 - drawable에 ripple 태그를 활용해 효과 시에 보일 모양을 지정할 수 있다. - 그리고 생성한 리소스를 foreground로 설정해주면 완료val tab = FrameLayout(context).apply { layoutParams = LinearLayout.LayoutParams(0, MATCH_PARENT, 1f).apply { setMargins(tabMargin / 2, tabMargin, tabMargin / 2, tabMargin) } isClickable = true isFocusable = true s..
SeungYong.Lee
'Development' 카테고리의 글 목록