From 9de1c93a5e680a5521a740c48db79d2e1eef4caa Mon Sep 17 00:00:00 2001 From: jeongwy04 Date: Mon, 6 Apr 2026 21:10:52 +0900 Subject: [PATCH 1/6] week2 --- .idea/gradle.xml | 1 + .idea/inspectionProfiles/Project_Default.xml | 61 ++++++++++++++++ .idea/misc.xml | 3 +- .../com/example/android_study/MainActivity.kt | 71 ++++++++++++++++--- 4 files changed, 124 insertions(+), 12 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 97f0a8e..639c779 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,5 +1,6 @@ + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 438fa1d..d30a702 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -49,6 +49,7 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) + implementation(libs.generativeai) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/java/com/example/android_study/MainActivity.kt b/app/src/main/java/com/example/android_study/MainActivity.kt index 102f95e..c7b9c48 100644 --- a/app/src/main/java/com/example/android_study/MainActivity.kt +++ b/app/src/main/java/com/example/android_study/MainActivity.kt @@ -4,95 +4,383 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.Canvas import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AccountCircle +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Email +import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material.icons.filled.FavoriteBorder +import androidx.compose.material.icons.filled.Home +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material.icons.filled.Notifications +import androidx.compose.material.icons.filled.Person +import androidx.compose.material.icons.filled.PlayArrow +import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.filled.Send +import androidx.compose.material.icons.filled.Star +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathEffect +import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.example.android_study.ui.theme.AndroidstudyTheme + class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { - AndroidstudyTheme { - Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + AndroidstudyTheme() { + FeedUI() + } + } + } +} + +// 스토리 데이터 클래스 +data class StoryData( + val id: Int, + val userName: String +) + +// 게시물 데이터 클래스 +data class PostData( + val id: Int, + val userName: String, + val location: String, + val timeAgo: String +) + +@Composable +fun FeedUI(){ + val stories = listOf( + StoryData(1, "jeong"), + StoryData(2, "woo"), + StoryData(3, "young"), + StoryData(4, "bong") + ) + + val posts = listOf( + PostData(1, "jeong", "Busan", "10m ago"), + PostData(2, "woo", "Seoul", "2h ago"), + PostData(3, "young", "Ulsan", "Yesterday"), + PostData(4, "bong", "Busan", "3 days ago") + ) + Scaffold( + topBar = {//제일 위에 부분 + Row( + modifier= Modifier + .fillMaxWidth() + .padding(start = 16.dp,end = 16.dp, top = 40.dp, bottom = 10.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ){ + Row(verticalAlignment = Alignment.CenterVertically){ + Icon(Icons.Default.Add, contentDescription = "Plus", modifier = Modifier + .clip(CircleShape) + .clickable { } + .size(28.dp)) + Spacer(modifier = Modifier.width(16.dp))//위에 plus 해결하기 + Text(text = "jwy", fontSize = 20.sp, fontWeight = FontWeight.Bold) + } + Box(contentAlignment = Alignment.TopEnd){ + Icon(Icons.Default.Email, contentDescription = "Messages", modifier = Modifier + .clip(CircleShape) + .clickable { } + .size(28.dp)) Box( modifier = Modifier - .fillMaxSize() - .padding(innerPadding), + .offset(x=4.dp,y=(-2).dp) + .size(16.dp) + .background(Color(0xFFFF5722), CircleShape), contentAlignment = Alignment.Center + ){ + Text(text = "2",color = Color.White,fontSize=9.sp , fontWeight = FontWeight.Bold,modifier = Modifier.offset(y = (-5).dp)) + } + } + } + }, + bottomBar = {//아래 홈,알림,좋아요,돋보기,프로필 부분 + NavigationBar( + containerColor = Color.White, + tonalElevation = 8.dp + ){ + NavigationBarItem( + selected = true, + onClick = {}, + icon = { + Icon(Icons.Default.Home, contentDescription = "Home",tint = Color(0xFFFF5722)) + } + ) + NavigationBarItem( + selected = false, + onClick = { }, + icon = { Icon(Icons.Default.Notifications, contentDescription = "Notifications") } + ) + NavigationBarItem( + selected = false, + onClick = { }, + icon = { Icon(Icons.Default.FavoriteBorder, contentDescription = "Activity") } + ) + NavigationBarItem( + selected = false, + onClick = { }, + icon = { Icon(Icons.Default.Search, contentDescription = "Search") } + ) + NavigationBarItem( + selected = false, + onClick = { }, + icon = { Icon(Icons.Default.AccountCircle, contentDescription = "Profile") } + ) + } + } + ){ paddingValues -> + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + ){ + item {Spacer(modifier = Modifier.height(16.dp))} + + item {//스토리 부분 + LazyRow( + contentPadding = PaddingValues(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp) + ){ + item { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Box(//내스토리 + modifier = Modifier + .clip(CircleShape) + .clickable { } + .size(65.dp) + .background(Color(0xFF1E1E1E), CircleShape) + .border(2.dp, Color.LightGray, CircleShape), + contentAlignment = Alignment.Center + ){ + Icon(Icons.Default.Add, contentDescription = "Add Story", tint = Color.White ) + } + Spacer(modifier=Modifier.height(8.dp)) + Text("Add Story",fontSize=12.sp,color=Color.DarkGray) + } + } + //다른사람들 스토리 + items(stories.size){index -> + val story = stories[index] + Column(horizontalAlignment = Alignment.CenterHorizontally){ + Box( + modifier = Modifier + .clip(CircleShape) + .clickable { } + .size(65.dp), + contentAlignment = Alignment.Center + ){ + val stroke = Stroke( + width = 4f, + pathEffect = PathEffect.dashPathEffect( + floatArrayOf(15f, 10f), + 0f + ) + ) + Canvas(modifier=Modifier.matchParentSize()){ + drawCircle(color = Color(0xFFFF5722),style=stroke) + } + Box( + modifier= Modifier + .size(55.dp) + .clip(CircleShape) + .background(Color.Gray) + ) + } + Spacer(modifier=Modifier.height(8.dp)) + Text(story.userName,fontSize=12.sp,color=Color.DarkGray) + } + } + } + } + item {Spacer(modifier=Modifier.height(24.dp))} + item {//recent, following, trendy 바 + Box( + modifier= Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + .height(50.dp) + .background(Color(0xFFFF5722),RoundedCornerShape(25.dp)) + ){ + Row( + modifier= Modifier.fillMaxSize(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly ) { - ProfileCard("정우영") + Box( + modifier = Modifier + .clip(RoundedCornerShape(20.dp)) + .clickable { /* 클릭 시 동작할 코드 */ } + .padding(horizontal = 16.dp, vertical = 8.dp) + ) { + Text("Recent", color = Color.White, fontSize = 14.sp) + } + Box( + modifier = Modifier + .clip(RoundedCornerShape(20.dp)) + .clickable { } + .padding(horizontal = 16.dp, vertical = 8.dp) + ) { + Text("Following", color = Color.White, fontSize = 14.sp) + } + Box( + modifier = Modifier + .clip(RoundedCornerShape(20.dp)) // 클릭 효과가 버튼 모양에 맞게 + .clickable { /* 클릭 시 동작할 코드 */ } + .background(Color.White, RoundedCornerShape(20.dp)) + .padding(horizontal = 20.dp, vertical = 8.dp) + ) { + Text( + "Trendy", + color = Color(0xFFFF5722), + fontSize = 14.sp, + fontWeight = FontWeight.Bold + ) + } + } + } + } + item {Spacer(modifier=Modifier.height(24.dp))} + //게시물 부분 + items(posts.size){index -> + val post = posts[index] + Column(modifier = Modifier.padding(bottom=16.dp)){ + Card( + modifier= Modifier + .fillMaxWidth() + .padding(horizontal =16.dp), + colors = CardDefaults.cardColors(containerColor = Color.White), + elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), + shape = RoundedCornerShape(16.dp) + ){ + Column{ + Row(//게시물 위 프로필, 지역, 시간 등 표시 + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically + ){ + Box( + //게시한 사람 프로필 + modifier= Modifier + .clip(CircleShape) + .clickable { } + .size(40.dp) + .border(1.dp,Color(0xFFFF5722),CircleShape) + .padding(2.dp) + .clip(CircleShape) + .background(Color.Gray) + + ){ + Icon( + imageVector = Icons.Default.Person, + contentDescription = "Profile Picture", + tint = Color.White, + modifier = Modifier.fillMaxSize() + ) + } + Spacer(modifier=Modifier.width(12.dp)) + + Column(modifier = Modifier.weight(1f)){ + Text(post.userName, fontWeight = FontWeight.Bold,fontSize=14.sp) + Row(verticalAlignment = Alignment.CenterVertically) { + Text("At ${post.location}, ", color = Color.Gray, fontSize = 12.sp) + Text(post.timeAgo, color = Color.LightGray, fontSize = 12.sp) + } + } + Icon(Icons.Default.Star, contentDescription="Bookmark", tint=Color.Gray,modifier= Modifier + .clip(CircleShape) + .clickable { } + ) + } + } + Box(//사진,영상 부분 + modifier= Modifier + .fillMaxWidth() + .height(300.dp) + .background(Color(0xFFFFCDD2)) + ){ + Icon( + Icons.Default.PlayArrow, + contentDescription = "Play", + tint = Color.White, + modifier = Modifier + .clip(CircleShape) + .clickable { } + .align(Alignment.Center) + .size(60.dp) + ) + } + Row(//하단 좋아요, ,댓글, 메시지부분 + modifier= Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp,vertical =12.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp) + ){ + Icon(Icons.Default.Favorite,contentDescription="Like",tint = Color.Gray,modifier=Modifier.clip(CircleShape).clickable { }) + Icon(Icons.Default.Search,contentDescription="Comment",tint = Color.Gray,modifier=Modifier.clip(CircleShape).clickable { }) + Icon(Icons.Default.Send,contentDescription="Share",tint = Color.Gray,modifier=Modifier.clip(CircleShape).clickable { }) + + Spacer(modifier = Modifier.weight(1f)) + + Icon(Icons.Default.MoreVert,contentDescription="More",tint = Color.Gray,modifier=Modifier.clip(CircleShape).clickable { }) + } } } } + item {Spacer(modifier=Modifier.height(16.dp))} } } -} -@Composable -fun ProfileCard(name: String) { - Row( - modifier = Modifier - .padding(16.dp) - .fillMaxWidth(1f) - .background(Color(0xFFF0F0F0), shape = RoundedCornerShapegit (12.dp)) - .padding(16.dp), - verticalAlignment = Alignment.CenterVertically - ) { - // 1. 프로필 아이콘 - Icon( - imageVector = Icons.Default.AccountCircle, - contentDescription = null, - modifier = Modifier.size(50.dp), - tint = Color.Gray - ) - - Spacer(modifier = Modifier.width(16.dp)) - - // 2. 이름과 설명 - Column { - Text( - text = name, - fontSize = 20.sp, - fontWeight = FontWeight.Bold, - color = Color.Black - ) - Text( - text = "Pusan National University \nComputer Science & Engineering", - fontSize = 14.sp, - color = Color.DarkGray - ) - } - } } + + @Preview(showBackground = true) @Composable fun GreetingPreview() { AndroidstudyTheme { - ProfileCard("정우영") + FeedUI() } } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 567c31c..ae5b91c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,7 @@ espressoCore = "3.7.0" lifecycleRuntimeKtx = "2.10.0" activityCompose = "1.13.0" composeBom = "2024.09.00" +generativeai = "0.9.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -24,6 +25,7 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +generativeai = { group = "com.google.ai.client.generativeai", name = "generativeai", version.ref = "generativeai" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From 96433a5fe082cdda7387977dbddd27950f9890b8 Mon Sep 17 00:00:00 2001 From: jeongwy04 Date: Mon, 4 May 2026 20:20:36 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=ED=95=98=EB=8B=A8=EB=B0=94=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EA=B2=80=EC=83=89=ED=83=AD=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/android_study/MainActivity.kt | 434 ++++++++++-------- 1 file changed, 231 insertions(+), 203 deletions(-) diff --git a/app/src/main/java/com/example/android_study/MainActivity.kt b/app/src/main/java/com/example/android_study/MainActivity.kt index c7b9c48..7f26eed 100644 --- a/app/src/main/java/com/example/android_study/MainActivity.kt +++ b/app/src/main/java/com/example/android_study/MainActivity.kt @@ -39,14 +39,21 @@ import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Send import androidx.compose.material.icons.filled.Star +import androidx.compose.material3.Button import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.Scaffold import androidx.compose.material3.Text +import androidx.compose.material3.TextField import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -71,7 +78,7 @@ class MainActivity : ComponentActivity() { } } } - +val PointColor = Color(0xFFFF5722) // 스토리 데이터 클래스 data class StoryData( val id: Int, @@ -88,25 +95,13 @@ data class PostData( @Composable fun FeedUI(){ - val stories = listOf( - StoryData(1, "jeong"), - StoryData(2, "woo"), - StoryData(3, "young"), - StoryData(4, "bong") - ) - - val posts = listOf( - PostData(1, "jeong", "Busan", "10m ago"), - PostData(2, "woo", "Seoul", "2h ago"), - PostData(3, "young", "Ulsan", "Yesterday"), - PostData(4, "bong", "Busan", "3 days ago") - ) + var selectedTab by remember {mutableStateOf(0)} Scaffold( topBar = {//제일 위에 부분 Row( modifier= Modifier .fillMaxWidth() - .padding(start = 16.dp,end = 16.dp, top = 40.dp, bottom = 10.dp), + .padding(start = 16.dp, end = 16.dp, top = 40.dp, bottom = 10.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ){ @@ -125,9 +120,9 @@ fun FeedUI(){ .size(28.dp)) Box( modifier = Modifier - .offset(x=4.dp,y=(-2).dp) + .offset(x = 4.dp, y = (-2).dp) .size(16.dp) - .background(Color(0xFFFF5722), CircleShape), + .background(PointColor, CircleShape), contentAlignment = Alignment.Center ){ Text(text = "2",color = Color.White,fontSize=9.sp , fontWeight = FontWeight.Bold,modifier = Modifier.offset(y = (-5).dp)) @@ -135,243 +130,276 @@ fun FeedUI(){ } } }, + bottomBar = {//아래 홈,알림,좋아요,돋보기,프로필 부분 NavigationBar( containerColor = Color.White, tonalElevation = 8.dp ){ NavigationBarItem( - selected = true, - onClick = {}, - icon = { - Icon(Icons.Default.Home, contentDescription = "Home",tint = Color(0xFFFF5722)) - } + selected = selectedTab ==0, + onClick = {selectedTab = 0}, + icon = { Icon(Icons.Default.Home, contentDescription = "Home")} , + colors = NavigationBarItemDefaults.colors( + indicatorColor = Color.Transparent + ) ) NavigationBarItem( - selected = false, - onClick = { }, - icon = { Icon(Icons.Default.Notifications, contentDescription = "Notifications") } + selected = selectedTab == 1, + onClick = {selectedTab = 1}, + icon = { Icon(Icons.Default.Notifications, contentDescription = "Notifications") }, + colors = NavigationBarItemDefaults.colors( + indicatorColor = Color.Transparent + ) ) NavigationBarItem( - selected = false, - onClick = { }, - icon = { Icon(Icons.Default.FavoriteBorder, contentDescription = "Activity") } + selected = selectedTab == 2, + onClick = {selectedTab = 2}, + icon = { Icon(Icons.Default.FavoriteBorder, contentDescription = "liked") }, + colors = NavigationBarItemDefaults.colors( + indicatorColor = Color.Transparent + ) ) NavigationBarItem( - selected = false, - onClick = { }, + selected = selectedTab == 3, + onClick = {selectedTab = 3}, icon = { Icon(Icons.Default.Search, contentDescription = "Search") } ) NavigationBarItem( - selected = false, - onClick = { }, + selected = selectedTab == 4, + onClick = {selectedTab = 4}, icon = { Icon(Icons.Default.AccountCircle, contentDescription = "Profile") } ) } } ){ paddingValues -> - LazyColumn( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - ){ - item {Spacer(modifier = Modifier.height(16.dp))} - - item {//스토리 부분 - LazyRow( - contentPadding = PaddingValues(horizontal = 16.dp), - horizontalArrangement = Arrangement.spacedBy(16.dp) - ){ - item { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Box(//내스토리 - modifier = Modifier - .clip(CircleShape) - .clickable { } - .size(65.dp) - .background(Color(0xFF1E1E1E), CircleShape) - .border(2.dp, Color.LightGray, CircleShape), - contentAlignment = Alignment.Center - ){ - Icon(Icons.Default.Add, contentDescription = "Add Story", tint = Color.White ) - } - Spacer(modifier=Modifier.height(8.dp)) - Text("Add Story",fontSize=12.sp,color=Color.DarkGray) - } - } - //다른사람들 스토리 - items(stories.size){index -> - val story = stories[index] - Column(horizontalAlignment = Alignment.CenterHorizontally){ - Box( - modifier = Modifier - .clip(CircleShape) - .clickable { } - .size(65.dp), - contentAlignment = Alignment.Center - ){ - val stroke = Stroke( - width = 4f, - pathEffect = PathEffect.dashPathEffect( - floatArrayOf(15f, 10f), - 0f - ) - ) - Canvas(modifier=Modifier.matchParentSize()){ - drawCircle(color = Color(0xFFFF5722),style=stroke) - } - Box( - modifier= Modifier - .size(55.dp) - .clip(CircleShape) - .background(Color.Gray) - ) - } - Spacer(modifier=Modifier.height(8.dp)) - Text(story.userName,fontSize=12.sp,color=Color.DarkGray) - } - } - } + Box(modifier=Modifier.padding(paddingValues)){ + when(selectedTab){ + 0 -> HomeScreen() + 1 -> NotificationScreen() + 2 -> LikedScreen() + 3 -> SearchScreen() + 4 -> ProfileScreen() } - item {Spacer(modifier=Modifier.height(24.dp))} - item {//recent, following, trendy 바 - Box( - modifier= Modifier - .fillMaxWidth() - .padding(horizontal = 24.dp) - .height(50.dp) - .background(Color(0xFFFF5722),RoundedCornerShape(25.dp)) - ){ - Row( - modifier= Modifier.fillMaxSize(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceEvenly - ) { - Box( - modifier = Modifier - .clip(RoundedCornerShape(20.dp)) - .clickable { /* 클릭 시 동작할 코드 */ } - .padding(horizontal = 16.dp, vertical = 8.dp) - ) { - Text("Recent", color = Color.White, fontSize = 14.sp) - } + } + } +} + +@Composable +fun HomeScreen() { + val stories = listOf( + StoryData(1, "jeong"), + StoryData(2, "woo"), + StoryData(3, "young"), + StoryData(4, "bong") + ) + + val posts = listOf( + PostData(1, "jeong", "Busan", "10m ago"), + PostData(2, "woo", "Seoul", "2h ago"), + PostData(3, "young", "Ulsan", "Yesterday"), + PostData(4, "bong", "Busan", "3 days ago") + ) + + LazyColumn(modifier = Modifier.fillMaxSize()) { + item { + LazyRow( + contentPadding = PaddingValues(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier.padding(vertical = 10.dp) + ) { + item { + Column(horizontalAlignment = Alignment.CenterHorizontally) { Box( modifier = Modifier - .clip(RoundedCornerShape(20.dp)) + .clip(CircleShape) .clickable { } - .padding(horizontal = 16.dp, vertical = 8.dp) + .size(65.dp) + .background(Color(0xFF1E1E1E), CircleShape) + .border(2.dp, Color.LightGray, CircleShape), + contentAlignment = Alignment.Center ) { - Text("Following", color = Color.White, fontSize = 14.sp) + Icon(Icons.Default.Add, contentDescription = "Add Story", tint = Color.White) } + Spacer(modifier = Modifier.height(8.dp)) + Text("Add Story", fontSize = 12.sp, color = Color.DarkGray) + } + } + items(stories.size) { index -> + val story = stories[index] + Column(horizontalAlignment = Alignment.CenterHorizontally) { Box( modifier = Modifier - .clip(RoundedCornerShape(20.dp)) // 클릭 효과가 버튼 모양에 맞게 - .clickable { /* 클릭 시 동작할 코드 */ } - .background(Color.White, RoundedCornerShape(20.dp)) - .padding(horizontal = 20.dp, vertical = 8.dp) + .clip(CircleShape) + .clickable { } + .size(65.dp), + contentAlignment = Alignment.Center ) { - Text( - "Trendy", - color = Color(0xFFFF5722), - fontSize = 14.sp, - fontWeight = FontWeight.Bold + val stroke = Stroke( + width = 4f, + pathEffect = PathEffect.dashPathEffect(floatArrayOf(15f, 10f), 0f) + ) + Canvas(modifier = Modifier.matchParentSize()) { + drawCircle(color = PointColor, style = stroke) + } + Box( + modifier = Modifier + .size(55.dp) + .clip(CircleShape) + .background(Color.Gray) ) } + Spacer(modifier = Modifier.height(8.dp)) + Text(story.userName, fontSize = 12.sp, color = Color.DarkGray) } } } - item {Spacer(modifier=Modifier.height(24.dp))} - //게시물 부분 - items(posts.size){index -> - val post = posts[index] - Column(modifier = Modifier.padding(bottom=16.dp)){ - Card( - modifier= Modifier - .fillMaxWidth() - .padding(horizontal =16.dp), - colors = CardDefaults.cardColors(containerColor = Color.White), - elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), - shape = RoundedCornerShape(16.dp) - ){ - Column{ - Row(//게시물 위 프로필, 지역, 시간 등 표시 - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - verticalAlignment = Alignment.CenterVertically - ){ - Box( - //게시한 사람 프로필 - modifier= Modifier - .clip(CircleShape) - .clickable { } - .size(40.dp) - .border(1.dp,Color(0xFFFF5722),CircleShape) - .padding(2.dp) - .clip(CircleShape) - .background(Color.Gray) + } + + item { Spacer(modifier = Modifier.height(24.dp)) } - ){ - Icon( - imageVector = Icons.Default.Person, - contentDescription = "Profile Picture", - tint = Color.White, - modifier = Modifier.fillMaxSize() - ) - } - Spacer(modifier=Modifier.width(12.dp)) + item { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + .height(50.dp) + .background(PointColor, RoundedCornerShape(25.dp)) + ) { + Row( + modifier = Modifier.fillMaxSize(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly + ) { + Text("Recent", color = Color.White, fontSize = 14.sp) + Text("Following", color = Color.White, fontSize = 14.sp) + Box( + modifier = Modifier + .clip(RoundedCornerShape(20.dp)) + .clickable{} + .background(Color.White, RoundedCornerShape(20.dp)) + .padding(horizontal = 20.dp, vertical = 8.dp) + ) { + Text("Trendy", color = PointColor, fontSize = 14.sp, fontWeight = FontWeight.Bold) + } + } + } + } - Column(modifier = Modifier.weight(1f)){ - Text(post.userName, fontWeight = FontWeight.Bold,fontSize=14.sp) - Row(verticalAlignment = Alignment.CenterVertically) { - Text("At ${post.location}, ", color = Color.Gray, fontSize = 12.sp) - Text(post.timeAgo, color = Color.LightGray, fontSize = 12.sp) - } - } - Icon(Icons.Default.Star, contentDescription="Bookmark", tint=Color.Gray,modifier= Modifier + item { Spacer(modifier = Modifier.height(24.dp)) } + //게시물 부분 + items(posts.size) { index -> + val post = posts[index] + Column(modifier = Modifier.padding(bottom = 16.dp)) { + Card( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + colors = CardDefaults.cardColors(containerColor = Color.White), + elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), + shape = RoundedCornerShape(16.dp) + ) { + //게시물 위에 프로필이랑 이름 쪽 + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier .clip(CircleShape) - .clickable { } - ) + .size(40.dp) + .border(1.dp, PointColor, CircleShape) + .padding(2.dp) + .background(Color.Gray) + ) { + Icon(Icons.Default.Person, "profile", tint = Color.White, modifier = Modifier.fillMaxSize()) } + Spacer(modifier = Modifier.width(12.dp)) + Column(modifier = Modifier.weight(1f)) { + Text(post.userName, fontWeight = FontWeight.Bold, fontSize = 14.sp) + Text("At ${post.location}, ${post.timeAgo}", color = Color.Gray, fontSize = 12.sp) + } + Icon(Icons.Default.Star, "bookmark", tint = Color.Gray) } - Box(//사진,영상 부분 - modifier= Modifier + //게시물 사진부분 + Box( + modifier = Modifier .fillMaxWidth() .height(300.dp) .background(Color(0xFFFFCDD2)) - ){ - Icon( - Icons.Default.PlayArrow, - contentDescription = "Play", - tint = Color.White, - modifier = Modifier - .clip(CircleShape) - .clickable { } - .align(Alignment.Center) - .size(60.dp) - ) - + ) { + Icon(Icons.Default.PlayArrow, "paly", tint = Color.White, modifier = Modifier.align(Alignment.Center).size(60.dp)) } - Row(//하단 좋아요, ,댓글, 메시지부분 - modifier= Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp,vertical =12.dp), + //좋아요랑 그런거 + Row( + modifier = Modifier.fillMaxWidth().padding(16.dp), horizontalArrangement = Arrangement.spacedBy(16.dp) - ){ - Icon(Icons.Default.Favorite,contentDescription="Like",tint = Color.Gray,modifier=Modifier.clip(CircleShape).clickable { }) - Icon(Icons.Default.Search,contentDescription="Comment",tint = Color.Gray,modifier=Modifier.clip(CircleShape).clickable { }) - Icon(Icons.Default.Send,contentDescription="Share",tint = Color.Gray,modifier=Modifier.clip(CircleShape).clickable { }) - + ) { + Icon(Icons.Default.Favorite, "like", tint = Color.Gray) + Icon(Icons.Default.Search, "search", tint = Color.Gray) + Icon(Icons.Default.Send, "send", tint = Color.Gray) Spacer(modifier = Modifier.weight(1f)) - - Icon(Icons.Default.MoreVert,contentDescription="More",tint = Color.Gray,modifier=Modifier.clip(CircleShape).clickable { }) + Icon(Icons.Default.MoreVert, "option", tint = Color.Gray) } } } } - item {Spacer(modifier=Modifier.height(16.dp))} } } +} +@Composable +fun NotificationScreen(){ + +} +@Composable +fun LikedScreen(){ + var liked by remember{ mutableStateOf(false)} + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(16.dp) + ){ + Text("눌러봐라") + + Spacer(modifier=Modifier.height(16.dp)) + + Button( + onClick={ + liked = !liked + } + ){ + + Text(if(liked) "좋아요 취소" else "좋아요") + } + + } +} +@Composable +fun SearchScreen(){ + var name by remember{mutableStateOf("")} + Column( + modifier=Modifier + .fillMaxSize() + .padding(16.dp), + horizontalAlignment=Alignment.CenterHorizontally, + ){ + TextField( + + value = name, + onValueChange = {name =it}, + label = {Text("이름 입력")} + ) + Spacer(modifier=Modifier.height(16.dp)) + Text("입력한 검색어: $name") + } +} +@Composable +fun ProfileScreen(){ } From 6ce9bbe24b50b6e6ff86658e1ffc87aad88bebaf Mon Sep 17 00:00:00 2001 From: jeongwy04 Date: Thu, 7 May 2026 13:53:22 +0900 Subject: [PATCH 4/6] =?UTF-8?q?HomeScreen=EC=97=90=EC=84=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=86=A0=EB=A6=AC,=ED=8F=AC=EC=8A=A4=ED=8A=B8=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EA=B0=81=EA=B0=81=20=EB=B6=84=EB=A6=AC,=20SearchSc?= =?UTF-8?q?reen=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/android_study/MainActivity.kt | 330 +++++++++--------- 1 file changed, 163 insertions(+), 167 deletions(-) diff --git a/app/src/main/java/com/example/android_study/MainActivity.kt b/app/src/main/java/com/example/android_study/MainActivity.kt index 7f26eed..80d7e90 100644 --- a/app/src/main/java/com/example/android_study/MainActivity.kt +++ b/app/src/main/java/com/example/android_study/MainActivity.kt @@ -96,8 +96,26 @@ data class PostData( @Composable fun FeedUI(){ var selectedTab by remember {mutableStateOf(0)} + val stories = remember{ + listOf( + StoryData(1, "jeong"), + StoryData(2, "woo"), + StoryData(3, "young"), + StoryData(4, "bong") + ) + } + + val posts = remember{ + listOf( + PostData(1, "jeong", "Busan", "10m ago"), + PostData(2, "woo", "Seoul", "2h ago"), + PostData(3, "young", "Ulsan", "Yesterday"), + PostData(4, "bong", "Busan", "3 days ago") + ) + } + Scaffold( - topBar = {//제일 위에 부분 + topBar = {//화면 젤 위에 부분 Row( modifier= Modifier .fillMaxWidth() @@ -136,6 +154,7 @@ fun FeedUI(){ containerColor = Color.White, tonalElevation = 8.dp ){ + //홈 버튼 부분 NavigationBarItem( selected = selectedTab ==0, onClick = {selectedTab = 0}, @@ -144,121 +163,53 @@ fun FeedUI(){ indicatorColor = Color.Transparent ) ) + //좋아요탭 버튼 NavigationBarItem( selected = selectedTab == 1, onClick = {selectedTab = 1}, - icon = { Icon(Icons.Default.Notifications, contentDescription = "Notifications") }, + icon = { Icon(Icons.Default.FavoriteBorder, contentDescription = "liked") }, colors = NavigationBarItemDefaults.colors( indicatorColor = Color.Transparent ) ) + //검색탭 버튼 NavigationBarItem( selected = selectedTab == 2, onClick = {selectedTab = 2}, - icon = { Icon(Icons.Default.FavoriteBorder, contentDescription = "liked") }, - colors = NavigationBarItemDefaults.colors( - indicatorColor = Color.Transparent - ) + icon = { Icon(Icons.Default.Search, contentDescription = "Search") } ) + //계정탭 버튼 NavigationBarItem( selected = selectedTab == 3, onClick = {selectedTab = 3}, - icon = { Icon(Icons.Default.Search, contentDescription = "Search") } - ) - NavigationBarItem( - selected = selectedTab == 4, - onClick = {selectedTab = 4}, icon = { Icon(Icons.Default.AccountCircle, contentDescription = "Profile") } ) } } ){ paddingValues -> - Box(modifier=Modifier.padding(paddingValues)){ + Box(modifier=Modifier + .fillMaxSize() + .padding(paddingValues)){ when(selectedTab){ - 0 -> HomeScreen() - 1 -> NotificationScreen() - 2 -> LikedScreen() - 3 -> SearchScreen() - 4 -> ProfileScreen() + 0 -> HomeScreen(stories = stories, posts = posts) + 1 -> LikedScreen() + 2 -> SearchScreen(posts = posts) + 3 -> ProfileScreen() } } } } @Composable -fun HomeScreen() { - val stories = listOf( - StoryData(1, "jeong"), - StoryData(2, "woo"), - StoryData(3, "young"), - StoryData(4, "bong") - ) - - val posts = listOf( - PostData(1, "jeong", "Busan", "10m ago"), - PostData(2, "woo", "Seoul", "2h ago"), - PostData(3, "young", "Ulsan", "Yesterday"), - PostData(4, "bong", "Busan", "3 days ago") - ) - +fun HomeScreen(stories : List, posts : List) { LazyColumn(modifier = Modifier.fillMaxSize()) { - item { - LazyRow( - contentPadding = PaddingValues(horizontal = 16.dp), - horizontalArrangement = Arrangement.spacedBy(16.dp), - modifier = Modifier.padding(vertical = 10.dp) - ) { - item { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Box( - modifier = Modifier - .clip(CircleShape) - .clickable { } - .size(65.dp) - .background(Color(0xFF1E1E1E), CircleShape) - .border(2.dp, Color.LightGray, CircleShape), - contentAlignment = Alignment.Center - ) { - Icon(Icons.Default.Add, contentDescription = "Add Story", tint = Color.White) - } - Spacer(modifier = Modifier.height(8.dp)) - Text("Add Story", fontSize = 12.sp, color = Color.DarkGray) - } - } - items(stories.size) { index -> - val story = stories[index] - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Box( - modifier = Modifier - .clip(CircleShape) - .clickable { } - .size(65.dp), - contentAlignment = Alignment.Center - ) { - val stroke = Stroke( - width = 4f, - pathEffect = PathEffect.dashPathEffect(floatArrayOf(15f, 10f), 0f) - ) - Canvas(modifier = Modifier.matchParentSize()) { - drawCircle(color = PointColor, style = stroke) - } - Box( - modifier = Modifier - .size(55.dp) - .clip(CircleShape) - .background(Color.Gray) - ) - } - Spacer(modifier = Modifier.height(8.dp)) - Text(story.userName, fontSize = 12.sp, color = Color.DarkGray) - } - } - } + item {//스토리 부분 + StorySection(stories=stories) } item { Spacer(modifier = Modifier.height(24.dp)) } - item { + item { //recent, following, trendy 선택 탭 Box( modifier = Modifier .fillMaxWidth() @@ -290,112 +241,157 @@ fun HomeScreen() { //게시물 부분 items(posts.size) { index -> val post = posts[index] - Column(modifier = Modifier.padding(bottom = 16.dp)) { - Card( + PostItem(post=post) + } + } +} +@Composable +fun StorySection(stories: List){ + LazyRow( + contentPadding = PaddingValues(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier.padding(vertical = 10.dp) + ) { + //본인 스토리 추가 + item { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Box( modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), - colors = CardDefaults.cardColors(containerColor = Color.White), - elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), - shape = RoundedCornerShape(16.dp) + .clip(CircleShape) + .clickable { } + .size(65.dp) + .background(Color(0xFF1E1E1E), CircleShape) + .border(2.dp, Color.LightGray, CircleShape), + contentAlignment = Alignment.Center + ) { + Icon(Icons.Default.Add, contentDescription = "Add Story", tint = Color.White) + } + Spacer(modifier = Modifier.height(8.dp)) + Text("Add Story", fontSize = 12.sp, color = Color.DarkGray) + } + } + //다른 사람 스토리 + items(stories.size) { index -> + val story = stories[index] + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Box( + modifier = Modifier + .clip(CircleShape) + .clickable { } + .size(65.dp), + contentAlignment = Alignment.Center ) { - //게시물 위에 프로필이랑 이름 쪽 - Column { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Box( - modifier = Modifier - .clip(CircleShape) - .size(40.dp) - .border(1.dp, PointColor, CircleShape) - .padding(2.dp) - .background(Color.Gray) - ) { - Icon(Icons.Default.Person, "profile", tint = Color.White, modifier = Modifier.fillMaxSize()) - } - Spacer(modifier = Modifier.width(12.dp)) - Column(modifier = Modifier.weight(1f)) { - Text(post.userName, fontWeight = FontWeight.Bold, fontSize = 14.sp) - Text("At ${post.location}, ${post.timeAgo}", color = Color.Gray, fontSize = 12.sp) - } - Icon(Icons.Default.Star, "bookmark", tint = Color.Gray) - } - //게시물 사진부분 - Box( - modifier = Modifier - .fillMaxWidth() - .height(300.dp) - .background(Color(0xFFFFCDD2)) - ) { - Icon(Icons.Default.PlayArrow, "paly", tint = Color.White, modifier = Modifier.align(Alignment.Center).size(60.dp)) - } - //좋아요랑 그런거 - Row( - modifier = Modifier.fillMaxWidth().padding(16.dp), - horizontalArrangement = Arrangement.spacedBy(16.dp) - ) { - Icon(Icons.Default.Favorite, "like", tint = Color.Gray) - Icon(Icons.Default.Search, "search", tint = Color.Gray) - Icon(Icons.Default.Send, "send", tint = Color.Gray) - Spacer(modifier = Modifier.weight(1f)) - Icon(Icons.Default.MoreVert, "option", tint = Color.Gray) - } + val stroke = Stroke( + width = 4f, + pathEffect = PathEffect.dashPathEffect(floatArrayOf(15f, 10f), 0f) + ) + Canvas(modifier = Modifier.matchParentSize()) { + drawCircle(color = PointColor, style = stroke) } + Box( + modifier = Modifier + .size(55.dp) + .clip(CircleShape) + .background(Color.Gray) + ) } + Spacer(modifier = Modifier.height(8.dp)) + Text(story.userName, fontSize = 12.sp, color = Color.DarkGray) } } } } -@Composable -fun NotificationScreen(){ -} @Composable -fun LikedScreen(){ +fun PostItem(post : PostData){ var liked by remember{ mutableStateOf(false)} - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - modifier = Modifier - .fillMaxSize() - .padding(16.dp) - ){ - Text("눌러봐라") - - Spacer(modifier=Modifier.height(16.dp)) - - Button( - onClick={ - liked = !liked + Column(modifier = Modifier.padding(bottom = 16.dp)) { + Card( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + colors = CardDefaults.cardColors(containerColor = Color.White), + elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), + shape = RoundedCornerShape(16.dp) + ) { + //게시물 위에 프로필이랑 이름 부분 + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier + .clip(CircleShape) + .size(40.dp) + .border(1.dp, PointColor, CircleShape) + .padding(2.dp) + .background(Color.Gray) + ) { + Icon(Icons.Default.Person, "profile", tint = Color.White, modifier = Modifier.fillMaxSize()) + } + Spacer(modifier = Modifier.width(12.dp)) + Column(modifier = Modifier.weight(1f)) { + Text(post.userName, fontWeight = FontWeight.Bold, fontSize = 14.sp) + Text("At ${post.location}, ${post.timeAgo}", color = Color.Gray, fontSize = 12.sp) + } + Icon(Icons.Default.Star, "bookmark", tint = Color.Gray) + } + //게시물 사진부분 + Box( + modifier = Modifier + .fillMaxWidth() + .height(300.dp) + .background(Color(0xFFFFCDD2)) + ) { + Icon(Icons.Default.PlayArrow, "paly", tint = Color.White, modifier = Modifier.align(Alignment.Center).size(60.dp)) + } + //좋아요등 게시물 아래부분 + Row( + modifier = Modifier.fillMaxWidth().padding(16.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + Icon(Icons.Default.Favorite, "like", tint = Color.Gray) + Icon(Icons.Default.Search, "search", tint = Color.Gray) + Icon(Icons.Default.Send, "send", tint = Color.Gray) + Spacer(modifier = Modifier.weight(1f)) + Icon(Icons.Default.MoreVert, "option", tint = Color.Gray) + } } - ){ - - Text(if(liked) "좋아요 취소" else "좋아요") } - } } @Composable -fun SearchScreen(){ +fun LikedScreen(){ + + +} +@Composable +fun SearchScreen(posts : List){ var name by remember{mutableStateOf("")} - Column( + val filteredPosts = remember(name) { + posts.filter { post -> post.userName == name } + } + LazyColumn( modifier=Modifier .fillMaxSize() .padding(16.dp), horizontalAlignment=Alignment.CenterHorizontally, ){ - TextField( - + item{TextField( value = name, onValueChange = {name =it}, - label = {Text("이름 입력")} - ) - Spacer(modifier=Modifier.height(16.dp)) - Text("입력한 검색어: $name") + label = {Text("이름 입력")}, + )} + item{Spacer(modifier=Modifier.height(16.dp))} + item{Text("입력한 검색어: $name")} + item{Spacer(modifier=Modifier.height(16.dp))} + items(filteredPosts.size) { index -> + val post = filteredPosts[index] + PostItem(post=post) + } } } @Composable From aa99bb948548fb67fa041960dc22287eb9636e50 Mon Sep 17 00:00:00 2001 From: jeongwy04 Date: Sat, 9 May 2026 09:49:25 +0900 Subject: [PATCH 5/6] =?UTF-8?q?likedScreen=EC=97=90=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=EB=88=84=EB=A5=B8=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C=EB=90=98=EB=8F=84=EB=A1=9D=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/android_study/MainActivity.kt | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/example/android_study/MainActivity.kt b/app/src/main/java/com/example/android_study/MainActivity.kt index 80d7e90..5b533e8 100644 --- a/app/src/main/java/com/example/android_study/MainActivity.kt +++ b/app/src/main/java/com/example/android_study/MainActivity.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.Canvas import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -90,7 +91,8 @@ data class PostData( val id: Int, val userName: String, val location: String, - val timeAgo: String + val timeAgo: String, + var isLiked: Boolean = false ) @Composable @@ -192,7 +194,7 @@ fun FeedUI(){ .padding(paddingValues)){ when(selectedTab){ 0 -> HomeScreen(stories = stories, posts = posts) - 1 -> LikedScreen() + 1 -> LikedScreen(posts = posts) 2 -> SearchScreen(posts = posts) 3 -> ProfileScreen() } @@ -304,7 +306,7 @@ fun StorySection(stories: List){ @Composable fun PostItem(post : PostData){ - var liked by remember{ mutableStateOf(false)} + var liked by remember{ mutableStateOf(post.isLiked)} Column(modifier = Modifier.padding(bottom = 16.dp)) { Card( modifier = Modifier @@ -353,7 +355,18 @@ fun PostItem(post : PostData){ modifier = Modifier.fillMaxWidth().padding(16.dp), horizontalArrangement = Arrangement.spacedBy(16.dp) ) { - Icon(Icons.Default.Favorite, "like", tint = Color.Gray) + Icon( + imageVector=if(liked) Icons.Default.Favorite else Icons.Default.FavoriteBorder, + contentDescription = "Like", + modifier = Modifier.clickable( + interactionSource = remember{MutableInteractionSource()}, + indication = null + ){ + liked = !liked + post.isLiked = liked + }, + tint = if (liked) PointColor else Color.Gray + ) Icon(Icons.Default.Search, "search", tint = Color.Gray) Icon(Icons.Default.Send, "send", tint = Color.Gray) Spacer(modifier = Modifier.weight(1f)) @@ -364,9 +377,23 @@ fun PostItem(post : PostData){ } } @Composable -fun LikedScreen(){ - - +fun LikedScreen(posts: List){ + val likedPosts = remember(posts.map{it.isLiked}){ + posts.filter {it.isLiked} + } + LazyColumn(modifier = Modifier.fillMaxSize()){ + item{ + Text( + "Liked Posts", + modifier = Modifier.padding(16.dp), + fontSize = 20.sp, + fontWeight = FontWeight.Bold + ) + } + items(likedPosts.size){index -> + PostItem(post = likedPosts[index]) + } + } } @Composable fun SearchScreen(posts : List){ From 5372039242dcddf8f4453469be71de54f56fb0fd Mon Sep 17 00:00:00 2001 From: jeongwy04 Date: Sat, 9 May 2026 21:31:10 +0900 Subject: [PATCH 6/6] =?UTF-8?q?ProfileScreen=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/android_study/MainActivity.kt | 106 +++++++++++++++++- 1 file changed, 101 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/example/android_study/MainActivity.kt b/app/src/main/java/com/example/android_study/MainActivity.kt index 5b533e8..4f6d1d2 100644 --- a/app/src/main/java/com/example/android_study/MainActivity.kt +++ b/app/src/main/java/com/example/android_study/MainActivity.kt @@ -29,6 +29,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AccountCircle import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Email import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.filled.FavoriteBorder @@ -40,15 +41,21 @@ import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Send import androidx.compose.material.icons.filled.Star +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.AlertDialogDefaults.containerColor import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.NavigationBarItemDefaults +import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Scaffold import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.material3.TextField import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -59,6 +66,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Color.Companion.Gray import androidx.compose.ui.graphics.PathEffect import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.text.font.FontWeight @@ -94,7 +102,7 @@ data class PostData( val timeAgo: String, var isLiked: Boolean = false ) - +var accountUser by mutableStateOf("jwy") @Composable fun FeedUI(){ var selectedTab by remember {mutableStateOf(0)} @@ -112,7 +120,9 @@ fun FeedUI(){ PostData(1, "jeong", "Busan", "10m ago"), PostData(2, "woo", "Seoul", "2h ago"), PostData(3, "young", "Ulsan", "Yesterday"), - PostData(4, "bong", "Busan", "3 days ago") + PostData(4, "jwy", "Busan", "3 days ago"), + PostData(5, "jwy", "Busan", "3 days ago"), + PostData(6, "jwy", "Busan", "3 days ago") ) } @@ -131,7 +141,7 @@ fun FeedUI(){ .clickable { } .size(28.dp)) Spacer(modifier = Modifier.width(16.dp))//위에 plus 해결하기 - Text(text = "jwy", fontSize = 20.sp, fontWeight = FontWeight.Bold) + Text(text = accountUser, fontSize = 20.sp, fontWeight = FontWeight.Bold) } Box(contentAlignment = Alignment.TopEnd){ Icon(Icons.Default.Email, contentDescription = "Messages", modifier = Modifier @@ -196,7 +206,7 @@ fun FeedUI(){ 0 -> HomeScreen(stories = stories, posts = posts) 1 -> LikedScreen(posts = posts) 2 -> SearchScreen(posts = posts) - 3 -> ProfileScreen() + 3 -> ProfileScreen(posts = posts) } } } @@ -377,6 +387,7 @@ fun PostItem(post : PostData){ } } @Composable +//좋아요 누른 게시물 모아보기 fun LikedScreen(posts: List){ val likedPosts = remember(posts.map{it.isLiked}){ posts.filter {it.isLiked} @@ -396,6 +407,7 @@ fun LikedScreen(posts: List){ } } @Composable +//이름 검색해 게시물 검색 fun SearchScreen(posts : List){ var name by remember{mutableStateOf("")} val filteredPosts = remember(name) { @@ -422,7 +434,91 @@ fun SearchScreen(posts : List){ } } @Composable -fun ProfileScreen(){ +fun ProfileScreen(posts : List){ + var onEditing by remember {mutableStateOf(false)} + var newName by remember(accountUser) {mutableStateOf(accountUser)} + val myPosts = remember{ + posts.filter{post -> post.userName == accountUser} + } + var followerNumber = 0 + var followingNumber =0 + Column{ + LazyRow( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically + ){ + item{ + Column(horizontalAlignment = Alignment.CenterHorizontally){ + Icon(Icons.Default.Person, "profile",tint=Color.Gray, + modifier = Modifier.size(80.dp) + ) + if(onEditing){ + TextField( + value = newName, + onValueChange = {newName = it }, + label = {Text("입력")}, + trailingIcon = { + IconButton(onClick = { + accountUser = newName + onEditing = false}) { + Icon(Icons.Default.Check, contentDescription = "확인", modifier=Modifier.size(24.dp)) + } + } + ) + }else{ + Button(onClick = {onEditing = true}, + modifier= Modifier + .width(70.dp) + .height(25.dp), + contentPadding = PaddingValues(0.dp), + colors = ButtonDefaults.buttonColors( + containerColor = PointColor + ) + ){ + Text("이름 변경", color = Color.White,fontSize=12.sp) + } + } + } + } + item{ + Row( + modifier = Modifier + .fillMaxWidth() + .padding(start = 30.dp), + horizontalArrangement = Arrangement.spacedBy(30.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally){ + Text("${myPosts.size}",fontWeight = FontWeight.Bold,fontSize = 25.sp) + Text("posts",fontSize = 16.sp) + } + Column(horizontalAlignment = Alignment.CenterHorizontally){ + Text("${followerNumber}",fontWeight = FontWeight.Bold,fontSize = 25.sp) + Text("followers",fontSize = 16.sp) + } + Column(horizontalAlignment = Alignment.CenterHorizontally){ + Text("${followingNumber}",fontWeight = FontWeight.Bold,fontSize = 25.sp) + Text("followings",fontSize = 15.sp) + } + } + } + } + Spacer(modifier=Modifier.height(16.dp)) + //내 게시물 + LazyColumn( + modifier=Modifier + .fillMaxSize() + .padding(16.dp), + horizontalAlignment=Alignment.CenterHorizontally, + ){ + items(myPosts.size) { index -> + val post = myPosts[index] + PostItem(post=post) + } + } + } }