Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

OX11001101100101001100010110110101

Jetpack Compose - Bottom Navigation Bar로 움직이기 본문

개발/모바일

Jetpack Compose - Bottom Navigation Bar로 움직이기

11001101100101001100010110110101 2024. 7. 10. 23:09

앱 바  |  Jetpack Compose  |  Android Developers

 

 

앱 바  |  Jetpack Compose  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 앱 바 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 앱 바는 사용자에게 주요 기능 및 탐색 항목에

developer.android.com

Indication 및 Ripple API로 이전  |  Jetpack Compose  |  Android Developers

 

Indication 및 Ripple API로 이전  |  Jetpack Compose  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Indication 및 Ripple API로 이전 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Modifier.clickable를 사용하는

developer.android.com

Compose를 사용한 탐색  |  Jetpack Compose  |  Android Developers

 

Compose를 사용한 탐색  |  Jetpack Compose  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Compose를 사용한 탐색 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Navigation 구성요소는 Jetpack Compose

developer.android.com

[Jetpack Compose] clickable 클릭 효과 커스텀 하게 설정하기 : Custom Indication 구현하기 — 조세영의 Kotlin World

 

[Jetpack Compose] clickable 클릭 효과 커스텀 하게 설정하기 : Custom Indication 구현하기

clickable의 기본 클릭 효과 살펴보기 이전 글에서 clickable의 기본 클릭 효과가 매우 어색한 것을 보았다. 이것이 왜 어색하게 느껴졌는지 구현체를 보면서 살펴보도록 하자. 만약 우리가 clickable { }

kotlinworld.com

 


 

바텀 네비게이션 바를 사용하려면

앱수준의 build.gradle에서

dependencies {
    val nav_version = "2.7.7"

    implementation("androidx.navigation:navigation-compose:$nav_version")
}

추가 헤줘야 한다.

 

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            Test1Theme {
                val navController = rememberNavController()
                NavHost(
                    navController = navController,
                    startDestination = "home") {
                    composable("home") {
                        BasicScreen(navController=navController,topAppBarTitle="homeScreen") {
                            HomeScreen(navController = navController)
                        }
                    }
                    composable("second") {
                        BasicScreen(navController=navController,topAppBarTitle="secondScreen") {
                            SecondScreen(navController = navController)
                        }
                    }
                    composable("third") {
                        BasicScreen(navController=navController,topAppBarTitle="thirdScreen") {
                            ThirdScreen(navController = navController)
                        }
                    }
                }

            }
        }
    }
}

@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
fun BasicScreen(
    navController: NavController,
    topAppBarTitle: String,
    content:@Composable (NavController) -> Unit
) {
    val interactionSource = remember { MutableInteractionSource() }
    val isPressed by interactionSource.collectIsPressedAsState()

    Scaffold(
        topBar = {
            TopAppBar(
                title = {Text(text =topAppBarTitle)},
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = Color.Gray,
                    titleContentColor = Color.Blue
                ))
        },
        content = {
            ScreenContent(navController = navController) {
                content(navController)
            }
        },
        bottomBar = {
            BottomAppBar(
                modifier = Modifier.background(Color.Red),
                contentPadding = PaddingValues(20.dp)
            ) {
                IconButton(
                    onClick = { navController.navigate("home") },
                    modifier = Modifier
                        .weight(1f)
                        .clickable(
                            interactionSource = interactionSource,
                            indication = rememberRipple(color = Color.Gray, radius = 24.dp),
                            onClick = { navController.navigate("home") }
                        ),
                    content = {
                        Icon(
                            imageVector = Icons.Default.Home,
                            contentDescription = "Home",
                            tint = if (isPressed) Color.Red else Color.Blue
                        )
                    }
                )
                IconButton(
                    onClick = { navController.navigate("second") },
                    modifier = Modifier
                        .weight(1f)
                        .clickable(
                            onClick = {
                                navController.navigate("second")
                            },
                            indication = rememberRipple(
                                color = Color.Gray,
                                radius = 24.dp
                            ),
                            interactionSource = interactionSource,

                            )
                ) {
                    Icon(
                        imageVector = Icons.Default.Menu,
                        contentDescription = "Menu",
                        tint = Color.Blue

                    )
                }
                IconButton(
                    onClick = { navController.navigate("third") },
                    modifier = Modifier
                        .weight(1f)
                        .clickable(
                            onClick = {
                                navController.navigate("third")
                            },
                            indication = rememberRipple(
                                color = Color.Gray,
                                radius = 24.dp,
                            ),
                            interactionSource = interactionSource
                        ),

                ) {
                    Icon(
                        imageVector = Icons.Default.Settings,
                        contentDescription = "Settings",
                        tint = Color.Blue
                    )
                }
            }
        }
    )
}
@Composable
private fun ScreenContent(navController: NavController, content: @Composable (NavController) -> Unit) {
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        content(navController)
    }
}

@Composable
fun HomeScreen(navController: NavController) {
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally,
    ) {
        Text(text="첫 화면")
    }
}


@Composable
fun SecondScreen(navController: NavController) {
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally,
    ) {
        Text(text="두번째 화면")
    }
}


@Composable
fun ThirdScreen(navController: NavController) {
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally,
    ) {
        Text(text="세번째 화면")
    }
}

**Clickable()은 다음과 같이 구성되어있고

fun Modifier.clickable(
    interactionSource: MutableInteractionSource,
    indication: Indication?,
    enabled: Boolean = true,
    onClickLabel: String? = null,
    role: Role? = null,
    onClick: () -> Unit
)
출처: https://kotlinworld.com/452?category=973269 [조세영의 Kotlin World:티스토리]

 

잘 쓰려면 interactionSoucre,indication,Onclick이 중요하다고 하는데

이번시간에는 원하는 효과를 못줬으니까 다음에 잘 써보도록 하겠다.

 


어제 쓰다가 컴퓨터 블루 스크린 떠서 종료했다..;

흠 그나저나 버튼 눌렸을 때 색깔이 바껴야 하는거 같은데 왜 안바뀌는지 모르겠다.

지난 시간에 버튼의 배치를 해결하는 방법은 weight를 주는것이었다.

그리고 하나 더 이상한건 공홈에는 ripple이 deprecated됐다고 나오는데 왜 쓸수 있는건지 모르겠다.

내 버전이 더 낮은건가...?

 

다음 시간에는 이번에 해결못한거 해결(버튼 클릭하면 색깔 바뀌게, 찾아보니 ripple 효과라고 하는거 같다),

Fragment 도입, 코드를 좀 나눠 보려고 한다.가독성이 꽝이다.

 

+ 가능하다면 MVVM 패턴 도입까지 해보겠다.