- 결제 모듈 라이브러리를 업데이트하라는 알림이 와서 업데이트했더니 코틀린 버전도 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..
Android

- 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..
- 위젯 갱신을 위한 refresh 함수에서 생성자 접근 시에 발생했다.val widgetInstance = widgetClass.getDeclaredConstructor().newInstance() - 위젯 클래스를 생성자 없는 object로 선언하고, 생성자 접근 코드를 제거하여 refresh 함수를 수정했다.object MemoListWidget : GlanceAppWidget() {fun updateAll(context: Context) { CoroutineScope(Dispatchers.IO).launch { val manager = GlanceAppWidgetManager(context) val now = System.currentTimeMillis() ..
val bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888)val canvas = Canvas(bitmap)val paint = Paint()val path = Path()path.fillType = Path.FillType.EVEN_ODDpath.moveTo(0f, 40f)path.lineTo(5f, 0f)path.lineTo(5f, 80f)path.lineTo(0f, 40f)canvas.drawPath(path, paint)paint.strokeWidth = 10fcanvas.drawLine(5f, 40f, 200f, 40f, paint)val rightPath = Path()rightPath.fillType = Path.FillType.E..
- 다음과 같은 NestedScrollView를 화면에서 사용할 때, 사용자 편의성을 위해 최상단으로 한 번에 스크롤하는 기능이 필요할 때가 있다. - 그럴 때에 다음 scrollTo 함수를 사용해주면 된다.//스무스하게 이동fun scrollToTop() = with(binding) { scrollView.post { scrollView.smoothScrollTo(0, 0) }}//즉시 이동fun scrollToTopInstantly(scrollView: NestedScrollView) { scrollView.post { scrollView.scrollTo(0, 0) }}
- 내가 편하게 쓰려고 메모장 앱을 간단하게 만들고 있는데, 외부 웹 사이트에서 링크를 쉽게 공유하고 싶어 내 앱으로의 Intent 공유 기능을 활성화했다. - 과정은 다음과 같다. 일단 Intent로 공유받는 데이터를 수신할 Activity를 하나 생성해 준다.class ReceiveShareActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val sharedUrl = if (intent?.action == Intent.ACTION_SEND && intent.type == "text/plain") { ..
- 안드로이드 Glance에서 특정 화면을 열거나 로직을 수행하기 위해서는 GlanceModifier.onClick()에 Action을 명시해주어야 한다. - Glance의 Action은 UI 요소에 "동작"을 연결하는 역할을 하는 개념이다.위젯에서 특정 Activity 열기- 먼저 Glance에서 특정 화면을 열기 위해 ActionIntent는 아래와 같이 사용한다.modifier = GlanceModifier .size(20.dp) .clickable(onClick = actionStartActivity( Intent(context, WidgetSettingsActivity::class.java).apply { data = Uri.parse(KEY_WIDGE..

- 위젯을 구현하다 보면 사이즈 별로 다른 레이아웃을 제공하거나 높이 너비에 따라 View의 구성이 달라지는 구현을 필요로 할 때가 있다. - 기존 RemoteViews에서는 AppWidgetInfo에 접근하여 사이즈 값에 대해 확인했으나 Glance에서는 좀 다르다.appWidgetManager.getAppWidgetInfo(appWidgetId).minHeight - SizeMode 라는 값을 통해 위젯 크기 변화에 따른 레이아웃 구성 대응이 가능하다. - SizeMode는 Glance 위젯이 시스템에서 요구하는 사이즈 정보의 유연성을 어떻게 처리할지를 정의한다.sealed interface SizeMode { /** * The [GlanceAppWidget] provides a sing..