본문 바로가기
개발일지

Java/Kotiln 개별 액티비티(Activity)

by 앱또웹 2024. 11. 6.
728x90
반응형

https://app-of-web.tistory.com/16

 

자바(Java) 코틀린(Kotlin) 공통 UI 구현

https://app-of-web.tistory.com/15 버튼(Button)으로 초기화면 만들어보기코틀린(kotlin)의 안드로이드 확장 기능을 알아볼까요? 알아보기 위해선 우리의 그전 내용을 수정 해볼꺼에요텍스트 명을 'VIEW BINDI

app-of-web.tistory.com

 

자바(Java)

좌측 내비게이터에서 [app > kotlin+java > com.example.kotlinsample] 항목에서 오른쪽 우클릭

[New > Activity > Empty Views Activity] 빈 레이아웃을 생성합니다!

 

 

이름은 'BmiJavaActivity' , Generate a Layout File 체크 박스는 해제해주고 언어는 '자바(Java)'로 설정해 줍니다!

 

이제 레이아웃을 지정하지 않았기 때문에 지정해 주어야 합니다!

기본적인 코드가 작성 되어 있을텐데요, 그 중 @Override 아래 부분부터 다음과 같이 수정을 해줍니다

package com.example.kotlinsample;

import android.os.Bundle;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class BmiJavaActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        UI로 사용할 레이아웃 XML 파일을 지정한다.
        setContentView(R.layout.layout_view_binding);
    }
}

 

코틀린(Kotlin)

이제 자바와 마찬가지로 우리의 '코틀린(Kotlin)'도 비어있는 레이아웃을 설정해 줍니다

 

 

보시는 바와 같이

좌측 내비게이터에서 [app > kotlin+java > com.example.kotlinsample] 항목에서 오른쪽 우클릭

[New > Activity > Empty Views Activity] 빈 레이아웃을 생성

이름은 'BmiKotlinActivity' , Generate a Layout File 체크 박스는 해제해주고 언어는 '코틀린(Kotlin)으'로 설정해 줍니다!

(똑같죠? 맞아요 내용 복붙이에요)

 

package com.example.kotlinsample

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class BmiKotlinActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
//        UI로 사용할 레이아웃 XML 파일을 지정한다.
        setContentView(R.layout.layout_view_binding)
    }
}

 

그러면 마찬가지로 코드도 수정해 주면 좋겠죠!?

이렇게 같은 UI리소스를 설정하고 분리를 해두면 재사용하기가 편리하기 때문입니다!

 

그런데 실행해도 자바랑 코틀린이 별도로 실행되지 않습니다

그래서 'BMI 계산 코드'를 작성하기 전에 MainActivity, BmiJavaActivity, BmiKotlinActivity를 먼저 연결해보도록 하겠습니다

 

메인 액티비티 연결

'Intent(일종의 메시지 객체)' 라는 클래스를 사용해서 화면 전환을 해줄겁니다

그러면 우선 MainActivity.kt 코드 수정을 진행합니다

package com.example.kotlinsample

import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.example.kotlinsample.databinding.ActivityMainBinding
import com.example.kotlinsample.ui.theme.KotlinSampleTheme

class MainActivity : ComponentActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // View Binding 초기화
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // button1과 button2에 클릭 이벤트 설정
        binding.button1.setOnClickListener {
            startActivity(Intent(this, BmiJavaActivity::class.java))
        }

        binding.button2.setOnClickListener {
            startActivity(Intent(this, BmiKotlinActivity::class.java))
        }

        enableEdgeToEdge()
        setContent {
            KotlinSampleTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    Greeting(
                        name = "Android",
                        modifier = Modifier.padding(innerPadding)
                    )
                }
            }
        }
    }
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    // 클릭된 횟수를 저장할 상태 변수
    val clickCount = remember { mutableStateOf(0) }

    Text(
        text = "Hello $name!",
        modifier = modifier
    )

    Button(
        onClick = {
            clickCount.value += 1 // 버튼 클릭 시 클릭 횟수 증가
        }
    ) {
        Text(text = "Click Me") // 버튼 텍스트
    }
}

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

 

이렇게 수정을 진행하는데 ... 저는 오류가 나서 [Gradle Scripts > build.gradle.kts (Module :app)] 수정을 조금 해주었습니다

viewBinding {
    enable = true
}

안드로이드쪽에 이런 친구를 추가해주니 해결되네요?

지선생, 챗gpt에게 왜 그런지 물어보니 제가 지금 사용하는 스터디의 코드들이 이제 사용하지 않다보니 생긴 문제로

View Binding 활성화를 하여 문제를 해결하는 방법이라고 합니다

 

 

 

 

728x90
반응형