반응형

https://developer.android.com/develop/ui/compose/setup?hl=ko

 

빠른 시작  |  Jetpack Compose  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 빠른 시작 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Compose로 최적의 환경에서 개발하려면 Android

developer.android.com

build.gradle.kts (Module: app)
    kotlinOptions {
        jvmTarget = "1.8"
    }
    
    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.13"
    }

 

위 안드로이드 공식 문서를 참조하여 option과 dependency를 추가해 준다.

 

Compose Activity 생성

    File - New - Compose - Empty Activity

Compose Activity 생성

class ComposeActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            KotlinMemoTheme {
                // A surface container using the 'background' color from the theme
                Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
                    Greeting("Android")
                }
            }
        }
    }
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        text = "Hello $name!",
        modifier = modifier
    )
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    KotlinMemoTheme {
        Greeting("Android")
    }
}

Compose는 @Preview 어노테이션을 통해 미리보기가 가능하며, 기존 xml과 동일하게 Split / Design을 통해 해당 View를 확인 할 수 있다.

 

 Render Problem

위 예시 코드를 보면 "Hello Android!" 가 보여야 할 것 같지만, render problem이 발생하여 검은색 화면으로만 표시 되었다.

render problem

Compose Compiler Version 과 Compatible Kotlin Version이 동일 해야하며, 위 에러메세지는

Compatible Kotlin Version -> 1.9.22 를 사용 하지만 Compose Compiler Version -> 1.5.13 으로 맞춰주고 있음으로 발생하는 에러이다.

해당 버전은 다음 문서에서 확인 가능하다.

https://developer.android.com/jetpack/androidx/releases/compose-kotlin

 

Compose와 Kotlin의 호환성 지도  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Compose와 Kotlin의 호환성 지도 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 참고: Kotlin 2.0 이상을 사

developer.android.com

 

위 build.gradle 에서 설정한 composeOptions 의 kotlinCompilerExtensionVersion을 변경해 준다.

// Compatible Kotlin Version -> 1.9.22

// Compose Compiler Version -> 1.5.10

 

해당 설정이 끝난 후에도 Render Problem이 발생한다면, Api 레벨을 확인해 본다.

 

현재 IDE가 API 34를 지원하지 않고 있다고 한다.

https://stackoverflow.com/questions/77611812/android-compose-preview-render-problem-with-api-34-and-compose-ui-1-5-0

 

Android Compose preview "Render problem" with API 34 and Compose UI 1.5.0

I recently started a new app using Compose. I have AS Hedgehog 2023.1.1 installed. I am using API 34 and get an error in the compose preview. "Render problem" accompanied by a Layout fid...

stackoverflow.com

@Preview(apiLevel = 33)


Preview의 apiLevel을 33으로 지정하고 확인하면 Hello Android! 가 보이는 것을 확인 할 수 있다.

Hello Android!

 

반응형
반응형

동탄에서 자전거 스탬프 투어를 할 수 있다는 소식을 듣고

마침 연차인 오늘 투어를 떠났다. 💨

스탬프 투어 수첩

수첩은 '청소년 문화의 집' 2층 안내데스크에서 받을 수 있고,

 

수첩에는 전체적인 노선과 동탄1지역, 동탄2지역의 세부적인 노선이 나와있었다.

 

 동탄 청소년 문화의 집

수첩 받고 내려와서 문화의 집 뒤로 가면 첫번째 도장을 찍을 수 있는 스탬프가 보인다.

스탬프 위치 : 문화의 집 뒷편 자전거 거치대

동탄 센트럴파크 & 메타폴리스

농구장 쪽으로 조금 올라가면 보이는 센트럴파크

스탬프 위치 : 정자 앞

노작공원

노작공원도 센트럴파크에서 가까이 위치하고 있기에 무리없이 찾아갈 수 있었다.

이 친구는 길 따라가다가 계단 아래에 있어서,

몸만 내려갔다오는 것을 추천..

스탬프 위치 : 계단 우측

동탄여울공원

2동탄으로 넘어갈까 내려갔다가 갈까 고민하다가 결정한 동탄 여울공원

스탬프 위치 : 화장실 앞 분수대

선납숲공원

다시 올라와서 2동탄으로 넘어갔다.

자전거 탈 때는 항상 길이 헷갈려서 여기서부턴 카카오맵 키고 달려서 도착..!

스탬프 위치 : 우암루 아래 입구 부분

치동천공원

치동천 힐링정원 근처라고 적혀있는데,

찾기가 상당히 어려웠다.

 

치동천 힐링정원에서 길 건넌 후 아래로 내려가야 발견 할 수 있다...

스탬프 위치 : 치동천 힐링정원 건너편 아래 자전거 거치대 옆

목동이음터

길 따라서 가면 목동이음터 건물이 나오고 해당 건물 입구로 들어가면 찾을 수 있다.

스탬프 위치 : 건물 입구 기둥 뒤

동탄호수공원

호수공원 자전거 타고는 처음오는데,

이렇게 오니까 또 새롭다.

스탬프 위치 : 사진참조

방아다리공원

공원 내부로 들어오면 물레방아가 보여서 찾기 쉬웠다.

근데 잉크가 말라버려서 못찍고,, 자국만 남겨갔던 곳

스탬프 위치 : 공원 내 물레방아 앞

탄요유적공원

여긴 자전거 길은 아닌거 같은데 네비 따라 들어가서 찾은 마지막 장소

스탬프 위치 : 놀이터 안쪽 굴뚝조형물 앞

인증스티커
완주 기념품

꽤나 디테일 있는 러버덕 기념품 ㅋㅋㅋ

모자가 탈부착이라 모자 씌워줄 때 만족감 😎

자전거 길치 흔적

 

5~6월에 계획한 국토종주는 여러 상황 겹쳐 못갔지만, 아쉬운대로 축소판을 달린 느낌

 

길이 그렇게 좋은 느낌은 아니었고, 스탬프 위치도 수첩만 보고 가기에는 어려운 장소도 있었다.

 

신호 기다리면서 멍하니 건물들 바라보고 있으니 약간 임장 느낌도 나고..?

 

그래도 뭐든 해냈다는 기분이 마음을 풍요롭게 하는 건 변함이 없는 듯 하다 :)

 

 

반응형
반응형

광주 5.18 민주화 운동을 기억하는 취지에서 개최한 행사

 

또한, 참가비 일부를 기부한다는 따듯한 소식에 참가신청을 했다.

기념품

기념품 이렇게 많이 줘도 되나 싶을 정도...  b

특정장소에서 진행하는 것이 아니라 개인으로 수행하고 인증을 하는 것이다 보니 메달이 먼저 왔다.

항상 출발하기 전에 챙기는 닥터유 에너지바 2개 들고 오산천으로 이동 💨

항상 올때마다 감동을 주는 장소

 

여름 겨울의 풍경도 얼른 보고싶다.

전에 자전거 길 끝나는 곳 횡단보도에서 직진했더니 소풍정원이 나오고 더 가는 길이 없나 생각을 했다.

 

찾아보니 횡단보도 건너서 우회전을 하면 

좁은 길이 나오고

길 따라서 가면

또 다시 이어지는 길이 나온다...!

가는길에 쉬는 곳이 있어서 사진 몇장 남겼다.

워치로 찍을 수 있는지 몰랐는데, 3년만에 제 기능 하는 중 ㅎ..

고즈넉한 분위기 너무 좋다.

초행길은 항상 잘 가고 있는지 몰라서 자꾸만 서서 길을 확인하게 된다.

여기도 다리 건너고 다시 반대방향으로 가고 해서 조금 헷갈린 코스

 

결국 앞질러가시는 아저씨 뒤 졸졸 따라가서 목표지점에 도달 할 수 있었다 :)

팽성대교 - 안성천

팽성대교 쪽 길이 되게 좋다고 들어서 한바퀴 돌아보려했지만,

집 돌아가는 것도 생각해서 점심먹으러 갔다.

CU 맛집

가게 찍고 갔는데 폐점..

건너편 CU에서 보급하는데 여기서 자전거 타시는분들 많이 보았다.

혼자 찍고 다니는 것도 나쁘진 않네

바닥에 두고 찍어서 그런가 난간이 앞으로 무너질 것 같다 ㅋㅋㅋ

51.8km 에 맞춰서 한번 찍으려고했는데, 달리다보니까 54km라고 한다..

저녁약속 시간 맞추려고 그대로 직진!

 

매 주 가지는 일상 루틴에 의미있는 행사를 곁들이니 더 뜻깊은 하루가 된 것 같다 🔥🔥

반응형
반응형

소스트리 실행 시 갑자기 실행이 안되는 경우

 

C:\Users\사용자\AppData\Local\Atlassian\SourceTree.exe_Url_xxxxxxxx\3.4.10

 

위 경로에서 Composition.cache 파일 삭제 후 소스트리 재실행

반응형
반응형

android java에서 흔히 발생하는 nullPointException(NPE).

kotlin에서는 널 안전성 연산자를 제공하여 Null값에 대해 사전에 방지가 가능하다.

 

널 (null)이란 객체가 선언되었지만 초기화되지 않은 상태를 뜻한다.


※ Java NPE 예시

public class MainActivity extends AppCompatActivity {
    private String text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        int length = text.length();
    }
}

 

위 코드에서 text 변수가 초기화되지 않았으므로 NPE가 발생할 수 있다.


※ Kotlin 널 안전성 부여

class MainActivity : AppCompatActivity() {
    private var text: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // text 변수가 null인 경우를 처리하기 위해 안전한 호출 ?. 연산자를 사용합니다.
        val length = text?.length

        // 만약 text가 null이 아닌 경우에만 길이를 출력합니다.
        length?.let {
            println("Text length: $it")
        }
    }
}

 

text 변수에 nullable한 (String?)으로 선언되어 null값을 부여 할 수 있다.

var t1 : String? = "test"
t1 = null // (o)

var t2 : String = "test"
t2 = null // (x)

※ 널 안전성 호출 (?.)

nullable로 선언한 변수는 null을 대입할 경우 NPE(NullPointException)가 발생할 수 있기에 해당 변수에 접근 시 ?.로 접근을 해야한다.


※ 엘비스 연산자 (?:)

?: 를 우측으로 90도 회전하면 엘비스 프레슬리가 된다고 해서 붙여진 엘비스(Evis) 연산자

해당 연산자의 왼쪽 값이 null 이면 우측 값을 반환한다.

var test : String? = "세글자"
Log.d(TAG, "test 문구 글자 수 : ${test?.length ?: -1}")
test = null
Log.d(TAG, "test 문구 글자 수 : ${test?.length ?: -1}")

결과값

test 문구 글자 수 : 3
test 문구 글자 수 : -1

※ 예외 (!!)

!! 연산자는 객체가 널일 때 예외를 일으키는 연산자.

var test : String? = null
Log.d(TAG, "test : ${test!!.length}")

// 결과값
java.lang.NullPointerException: println needs a message
    at ...

해당 코드는 NPE를 발생시킨다. 특정 사항이 아니라면 사용하는 것을 지양한다.

반응형
반응형

2024.05.12 (일)

 

집에서 갈 수 있는 선택지가 두개가 있는 것 같다.

 

1. 오산천

2. 수원천

 

오산천 자주 가 봤으니 안가본 길로 가보기 위해 황구지천으로 이동..!

 

자전거 타면서 느끼는거지만 풍경이 상당하다

 

원래는 황구지천 - 수원천 - 광교로 넘어가려했으나, 위로가는 길을 못찾겠다

 

어쩔 수 없이 아래로 가는 길로 선택

뭔가 날도 좋고 사진도 찍고 싶어서 여러장 찍으면서 이동 한 날

이른 아침이라 추울 것 같아서 바람막이 입었는데

굿 초이스

 

진위천 다다랐을 때 라이딩 하시는 분들 따라갔더니

공사장 엔딩..

전날에 비도많이오고 해서 온통 진흙범벅

로드는 여기서 돌아갈게요 😭

진위천 오산천 사이에 있는 자전거 길

 

여기도 풍경 맛집

오산천 자전거길

다음엔 수원천으로 🔥🔥

반응형

+ Recent posts