반응형

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!

 

반응형
반응형

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를 발생시킨다. 특정 사항이 아니라면 사용하는 것을 지양한다.

반응형
반응형
    // Property that stores the button press time
    var initTime = 0L

    // Back button event handler
    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        // Processing when the back button is pressed
        if (keyCode === KeyEvent.KEYCODE_BACK) {
            // Handles when the back button is pressed for the first time or when 3 seconds have passed since the back button was pressed
            if (System.currentTimeMillis() - initTime > 3000) {
                Toast.makeText(this, "Press again to exit", Toast.LENGTH_SHORT).show()
                initTime = System.currentTimeMillis()
                return true
            }
        }
        return super.onKeyDown(keyCode, event)
    }
반응형

+ Recent posts