首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android 使用CodeBuddy提高开发效率

Android 使用CodeBuddy提高开发效率

作者头像
晨曦_LLW
发布2025-06-02 12:57:47
发布2025-06-02 12:57:47
35500
代码可运行
举报
运行总次数:0
代码可运行
使用CodeBuddy提高开发效率

前言

  随着时代的变化,AI的兴起,作为开发者,完成开发任务在之前我们需要充分的理解需求,寻找相关文档,进行功能的开发,而在今天我们可以用很多开发工具,帮助我们智能编程,快速完成功能开发。

正文

  而今天要帮助我们提高开发效率,进行智能编程的朋友是,CodeBuddy是腾讯云代码助手,如果你用过通义灵码的话,那么上手CodeBuddy也会很快,问题就来了,为什么我已经用通义灵码还要使用CodeBuddy呢?多尝试总没错,改变就是好事,多个工具可以让你对同一个问题的答案进行对比,减少错误,下面我们进入正题,效果如下所示:

一、创建项目

  首先我们打开Android Studio,创建一个Compose项目,选择Empty Activity

我使用的是比较新的Android Studio版本,现在默认Empty Activity值得是使用声明式UI进行编程的Activity,传统的代码+XML的方法是,请选择Empty Views Activity

点击Finish完成工程的创建。

当前项目创建完成,下面我们来配置CodeBuddy工具。

二、配置工具

这里我们通过插件的方式去安装CodeBuddy工具,点击File → Setting...

找到Plugins,点击Marketplace,输入CodeBuddy,选择Tencent Cloud CodeBuddy,最后点击Install进行安装。

安装好之后会让你重启Android Studio,点击 Restart IDEA按钮进行重启。

重启后打开项目会看到AS侧边栏和底部栏会有CodeBuddy的图标,点击侧边栏图标进行登录。

点击登录按钮之后会跳转到网页,你通过微信或手机号登录即可,登录成功后返回AS。

安装好这个工具之后我们来学习怎么使用。

三、使用工具

  工具的功能是很多的,我们依次介绍,首先我们说说代码分析功能。

1. 代码分析

  就拿当前的MainActivity.kt文件举例子,不少人还没有接触Compose UI,因此第一次接触不知道是什么?那么我们就可以使用代码分析功能去分析当前文件的所有代码:

在输入框输入@workspace,这表示当前的工作区,输入文件名称然后需求,回车一下:

可以看到解析了出来,这样输入确实有一些不方便,我们可以点击输入框的 #,选择File,然后输入Main,在结果中选择需要指向的文件,点击OK。

2. 需求编写

然后我们可以写一下需求,例如增加一个按钮。

将智能助手的描述内容应用到当前代码文件中后,如下图所示:

代码语言:javascript
代码运行次数:0
运行
复制
package com.llw.composedemo

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.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.llw.composedemo.ui.theme.ComposeDemoTheme
import androidx.compose.material3.Button
import androidx.compose.foundation.layout.Column
import androidx.compose.ui.unit.dp

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            ComposeDemoTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    Greeting(
                        name = "Android",
                        modifier = Modifier.padding(innerPadding)
                    )
                }
            }
        }
    }
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Column(modifier = modifier) {
        Text(text = "Hello $name!")
        Button(onClick = { /* 点击处理逻辑 */ }) {
            Text("Click Me")
        }
    }
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    ComposeDemoTheme {
        Greeting("Android", Modifier.padding(16.dp))
    }
}

运行一下,如下图所示:

增加了一个按钮。下面我们来写一些复杂一点的需求。

四、底部导航栏

接着我们在输入框输入“修改当前页面,增加一个底部导航栏、两个导航按钮”,回车。

结果如下所示:

1. 修改后的 MainActivity.kt
代码语言:javascript
代码运行次数:0
运行
复制
package com.llw.composedemo

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.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.llw.composedemo.ui.theme.ComposeDemoTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            ComposeDemoTheme {
                MainScreen()
            }
        }
    }
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainScreen() {
    val navController = rememberNavController()
    val items = listOf(
        Screen.Home,
        Screen.Profile
    )
    
    Scaffold(
        bottomBar = {
            NavigationBar {
                val currentRoute by navController.currentRouteAsState()
                items.forEach { screen ->
                    NavigationBarItem(
                        icon = { Icon(screen.icon, contentDescription = null) },
                        label = { Text(screen.title) },
                        selected = currentRoute == screen.route,
                        onClick = {
                            navController.navigate(screen.route) {
                                popUpTo(navController.graph.startDestinationId)
                                launchSingleTop = true
                            }
                        }
                    )
                }
            }
        }
    ) { innerPadding ->
        NavHost(
            navController = navController,
            startDestination = Screen.Home.route,
            modifier = Modifier.padding(innerPadding)
        ) {
            composable(Screen.Home.route) { HomeScreen() }
            composable(Screen.Profile.route) { ProfileScreen() }
        }
    }
}

// 定义屏幕类型
sealed class Screen(val route: String, val title: String, val icon: ImageVector) {
    object Home : Screen("home", "首页", Icons.Default.Home)
    object Profile : Screen("profile", "个人资料", Icons.Default.Person)
}

// 首页屏幕
@Composable
fun HomeScreen() {
    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        Text("欢迎来到首页")
    }
}

// 个人资料屏幕
@Composable
fun ProfileScreen() {
    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        Text("个人资料页面")
    }
}

// 扩展函数用于获取当前路由
@Composable
fun NavController.currentRouteAsState(): State<String?> {
    val currentRoute = remember { mutableStateOf(currentBackStackEntry?.destination?.route) }
    DisposableEffect(this) {
        val listener = NavController.OnDestinationChangedListener { _, destination, _ ->
            currentRoute.value = destination.route
        }
        addOnDestinationChangedListener(listener)
        onDispose {
            removeOnDestinationChangedListener(listener)
        }
    }
    return currentRoute
}

@Preview(showBackground = true)
@Composable
fun MainScreenPreview() {
    ComposeDemoTheme {
        MainScreen()
    }
}
2. 需要添加的依赖 (build.gradle.kts)
代码语言:javascript
代码运行次数:0
运行
复制
dependencies {
    implementation("androidx.navigation:navigation-compose:2.7.7")  // 导航组件
    implementation("androidx.compose.material:material-icons-extended:1.6.7")  // 图标库
}
3. 代码说明:
  1. 导航架构
    • 使用rememberNavController()管理导航状态
    • 定义了两个屏幕:HomeProfile
    • 使用NavHost容器管理屏幕切换
  2. 底部导航栏
    • 使用NavigationBar组件创建Material Design风格的底部导航
    • 每个导航项包含图标和文字标签
    • 当前选中状态会高亮显示
  3. 屏幕内容
    • HomeScreen显示简单的欢迎文本
    • ProfileScreen显示个人资料文本
    • 使用Box布局使内容居中显示
  4. 预览功能
    • 添加了MainScreenPreview用于预览完整界面
  5. 扩展功能
    • 添加了currentRouteAsState扩展函数,用于获取当前路由状态

这个实现遵循了Jetpack Compose的最佳实践,提供了清晰的导航结构和良好的用户体验。你可以根据需要进一步自定义每个屏幕的内容和导航栏样式。

上述的改动我需要说明一下,代码中提到了两个依赖库,我们需要在build.gradle.kts中添加依赖,如下图所示:

然后Sync Now一下,再根据修改后MainActivity.kt,去进行修改,修改后你会发现还少一些包,没有导入,则需要你手动导一下,这说明开发者还不能完全依赖智能工具,它提交的结果可以为我们解决95%的工作量,我们自己去完善和纠错,这是纠错后的代码:

代码语言:javascript
代码运行次数:0
运行
复制
package com.llw.composedemo

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Person
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.State
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.llw.composedemo.ui.theme.ComposeDemoTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            ComposeDemoTheme {
                MainScreen()
            }
        }
    }
}

@Composable
fun MainScreen() {
    val navController = rememberNavController()
    val items = listOf(
        Screen.Home,
        Screen.Profile
    )

    Scaffold(
        bottomBar = {
            NavigationBar {
                val currentRoute by navController.currentRouteAsState()
                items.forEach { screen ->
                    NavigationBarItem(
                        icon = { Icon(screen.icon, contentDescription = null) },
                        label = { Text(screen.title) },
                        selected = currentRoute == screen.route,
                        onClick = {
                            navController.navigate(screen.route) {
                                popUpTo(navController.graph.startDestinationId)
                                launchSingleTop = true
                            }
                        }
                    )
                }
            }
        }
    ) { innerPadding ->
        NavHost(
            navController = navController,
            startDestination = Screen.Home.route,
            modifier = Modifier.padding(innerPadding)
        ) {
            composable(Screen.Home.route) { HomeScreen() }
            composable(Screen.Profile.route) { ProfileScreen() }
        }
    }
}

// 定义屏幕类型
sealed class Screen(val route: String, val title: String, val icon: ImageVector) {
    object Home : Screen("home", "首页", Icons.Default.Home)
    object Profile : Screen("profile", "个人资料", Icons.Default.Person)
}

// 首页屏幕
@Composable
fun HomeScreen() {
    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        Text("欢迎来到首页")
    }
}

// 个人资料屏幕
@Composable
fun ProfileScreen() {
    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        Text("个人资料页面")
    }
}

// 扩展函数用于获取当前路由
@Composable
fun NavController.currentRouteAsState(): State<String?> {
    val currentRoute = remember { mutableStateOf(currentBackStackEntry?.destination?.route) }
    DisposableEffect(this) {
        val listener = NavController.OnDestinationChangedListener { _, destination, _ ->
            currentRoute.value = destination.route
        }
        addOnDestinationChangedListener(listener)
        onDispose {
            removeOnDestinationChangedListener(listener)
        }
    }
    return currentRoute
}

@Preview(showBackground = true)
@Composable
fun MainScreenPreview() {
    ComposeDemoTheme {
        MainScreen()
    }
}

我们可以运行一下:

对了有一点忘记说了,那就是这个代码是兼容深色和亮色模式的,我手机到了晚上自动深色模式,这个底部导航栏就写好了,你可以看看其实代码并不多,这也是Compose的魅力。

五、轮播图和新闻列表

输入 在首页中增加图片轮播和新闻列表,然后回车。

我将帮你修改代码,在首页(HomeScreen)中添加图片轮播和新闻列表功能。以下是完整的实现方案:

1. 修改后的 MainActivity.kt
代码语言:javascript
代码运行次数:0
运行
复制
// 新增导入
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.*
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import coil.compose.rememberAsyncImagePainter

// 首页数据类
data class NewsItem(
    val id: Int,
    val title: String,
    val content: String,
    val imageUrl: String,
    val date: String
)

// 图片轮播组件
@Composable
fun ImageCarousel() {
    val images = listOf(
        "https://example.com/image1.jpg",
        "https://example.com/image2.jpg",
        "https://example.com/image3.jpg"
    )
    
    LazyRow(
        modifier = Modifier
            .fillMaxWidth()
            .height(200.dp)
            .padding(vertical = 8.dp),
        horizontalArrangement = Arrangement.spacedBy(8.dp)
    ) {
        items(images) { imageUrl ->
            Image(
                painter = rememberAsyncImagePainter(imageUrl),
                contentDescription = "轮播图片",
                modifier = Modifier
                    .fillMaxHeight()
                    .clip(RoundedCornerShape(8.dp)),
                contentScale = ContentScale.Crop
            )
        }
    }
}

// 新闻列表项组件
@Composable
fun NewsListItem(news: NewsItem) {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(8.dp),
        shape = RoundedCornerShape(8.dp)
    ) {
        Column(modifier = Modifier.padding(16.dp)) {
            Row(verticalAlignment = Alignment.CenterVertically) {
                Image(
                    painter = rememberAsyncImagePainter(news.imageUrl),
                    contentDescription = "新闻图片",
                    modifier = Modifier
                        .size(80.dp)
                        .clip(RoundedCornerShape(8.dp)),
                    contentScale = ContentScale.Crop
                )
                Spacer(modifier = Modifier.width(16.dp))
                Column {
                    Text(
                        text = news.title,
                        style = MaterialTheme.typography.titleMedium,
                        fontWeight = FontWeight.Bold
                    )
                    Text(
                        text = news.date,
                        style = MaterialTheme.typography.labelSmall,
                        color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)
                    )
                }
            }
            Spacer(modifier = Modifier.height(8.dp))
            Text(
                text = news.content,
                style = MaterialTheme.typography.bodyMedium
            )
        }
    }
}

// 更新后的首页
@Composable
fun HomeScreen() {
    // 模拟新闻数据
    val newsList = remember {
        listOf(
            NewsItem(
                1,
                "Jetpack Compose 1.0 发布",
                "Google正式发布了Jetpack Compose 1.0版本,这是Android现代UI工具包的重大里程碑...",
                "https://example.com/news1.jpg",
                "2023-05-10"
            ),
            NewsItem(
                2,
                "Kotlin 2.0 新特性",
                "Kotlin 2.0带来了多项改进,包括性能提升和新语言特性...",
                "https://example.com/news2.jpg",
                "2023-05-08"
            ),
            NewsItem(
                3,
                "Android 14 开发者预览版",
                "Google发布了Android 14的第一个开发者预览版,包含多项新API...",
                "https://example.com/news3.jpg",
                "2023-05-05"
            )
        )
    }

    LazyColumn(
        modifier = Modifier.fillMaxSize(),
        contentPadding = PaddingValues(bottom = 56.dp)
    ) {
        item { 
            Text(
                text = "今日新闻",
                style = MaterialTheme.typography.headlineSmall,
                modifier = Modifier.padding(16.dp)
            )
        }
        item { ImageCarousel() }
        items(newsList) { news ->
            NewsListItem(news = news)
        }
    }
}
2. 需要添加的依赖 (build.gradle.kts)
代码语言:javascript
代码运行次数:0
运行
复制
dependencies {
    // 图片加载库
    implementation("io.coil-kt:coil-compose:2.5.0")
    // 分页加载库(可选)
    implementation("androidx.paging:paging-compose:3.2.1")
}
3. 代码说明:
  1. 图片轮播组件
    • 使用LazyRow实现水平滚动的图片轮播
    • 支持网络图片加载(使用Coil库)
    • 添加了圆角和间距样式
  2. 新闻列表
    • 使用LazyColumn实现垂直滚动列表
    • 每个新闻项包含图片、标题、日期和内容摘要
    • 采用Card组件实现Material Design卡片效果
  3. 数据模型
    • 定义了NewsItem数据类存储新闻信息
    • 使用remember缓存模拟数据
  4. 图片加载
    • 使用Coil库的rememberAsyncImagePainter加载网络图片
    • 支持图片裁剪和圆角处理
  5. 样式处理
    • 使用Material主题的排版样式
    • 添加了适当的间距和内边距
    • 支持深色/浅色主题适配

这个实现包含了现代APP常见的首页元素,你可以根据需要:

  • 替换为真实API数据
  • 添加点击事件处理
  • 实现自动轮播动画
  • 添加加载状态指示器
  • 集成分页加载更多功能
4. 修正代码

通过上述的代码其实还存在几个问题,一个是轮播图的加载,第二个就是网络权限的配置,我们可以这么去写,首先在AndroidManifest.xml中增加网络权限:

代码语言:javascript
代码运行次数:0
运行
复制
<uses-permission android:name="android.permission.INTERNET" />

然后在res下的xml中创建一个network_security_config.xml文件,代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后在application标签中添加

最后我通过这个助手提问,让重新帮我写了一个轮播图,创建AutoCarousel.kt文件,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.dp
import coil.compose.rememberAsyncImagePainter
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

/**
 * 自动轮播
 */
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun AutoCarousel(
    items: List<String>,
    autoScrollInterval: Long = 3000,
    modifier: Modifier = Modifier
) {
    val lazyListState = rememberLazyListState()
    val coroutineScope = rememberCoroutineScope()
    var currentIndex by remember { mutableIntStateOf(0) }

    // 自动轮播逻辑
    LaunchedEffect(lazyListState, items) {
        while (true) {
            delay(autoScrollInterval)
            currentIndex = (currentIndex + 1) % items.size
            lazyListState.animateScrollToItem(currentIndex)
        }
    }

    Box(modifier = modifier) {
        LazyRow(
            state = lazyListState,
            flingBehavior = rememberSnapFlingBehavior(lazyListState),
            modifier = Modifier.fillMaxWidth(),
            horizontalArrangement = Arrangement.spacedBy(8.dp)
        ) {
            itemsIndexed(items) { index, item ->
                Box(
                    modifier = Modifier
                        .fillParentMaxWidth()
                        .aspectRatio(16f / 9f)
                ) {
                    Image(
                        painter = rememberAsyncImagePainter(items[index]),
                        contentDescription = "新闻图片",
                        modifier = Modifier
                            .fillParentMaxWidth()
                            .clip(RoundedCornerShape(8.dp)),
                        contentScale = ContentScale.Crop
                    )
                }
            }
        }

        // 指示器
        Row(
            modifier = Modifier
                .align(Alignment.BottomCenter)
                .padding(bottom = 16.dp),
            horizontalArrangement = Arrangement.spacedBy(4.dp)
        ) {
            items.forEachIndexed { index, _ ->
                IndicatorDot(
                    isSelected = index == currentIndex,
                    onClick = {
                        coroutineScope.launch {
                            currentIndex = index
                            lazyListState.animateScrollToItem(index)
                        }
                    }
                )
            }
        }
    }
}

@Composable
private fun IndicatorDot(
    isSelected: Boolean,
    onClick: () -> Unit,
    modifier: Modifier = Modifier
) {
    val width by animateDpAsState(
        targetValue = if (isSelected) 12.dp else 8.dp,
        label = "indicatorWidth"
    )

    Box(
        modifier = modifier
            .size(width, 8.dp)
            .clip(MaterialTheme.shapes.small)
            .background(
                color = if (isSelected) MaterialTheme.colorScheme.primary
                       else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.2f)
            )
            .clickable { onClick() }
    )
}

最后让我们回到MainActivity.kt中,最终代码如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
package com.llw.composedemo

import AutoCarousel
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Image
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.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Person
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.State
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import coil.compose.rememberAsyncImagePainter
import com.llw.composedemo.ui.theme.ComposeDemoTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            ComposeDemoTheme {
                MainScreen()
            }
        }
    }
}

// 首页数据类
data class NewsItem(
    val id: Int,
    val title: String,
    val content: String,
    val imageUrl: String,
    val date: String
)

// 图片轮播组件
@Composable
fun ImageCarousel() {
    val images = listOf(
        "http://img0.adesk.com/download/57e9b82f94e5cc0a9e3e4148",
        "http://img0.adesk.com/download/57e4719c94e5cc3320a842d6",
        "http://img0.adesk.com/download/57e374d094e5cc14c62ac7ff"
    )
    AutoCarousel(
        items = images,
        modifier = Modifier.height(200.dp)
    )
}

// 新闻列表项组件
@Composable
fun NewsListItem(news: NewsItem) {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(8.dp),
        shape = RoundedCornerShape(8.dp)
    ) {
        Column(modifier = Modifier.padding(16.dp)) {
            Row(verticalAlignment = Alignment.CenterVertically) {
                Image(
                    painter = rememberAsyncImagePainter(news.imageUrl),
                    contentDescription = "新闻图片",
                    modifier = Modifier
                        .size(80.dp)
                        .clip(RoundedCornerShape(8.dp)),
                    contentScale = ContentScale.Crop
                )
                Spacer(modifier = Modifier.width(16.dp))
                Column {
                    Text(
                        text = news.title,
                        style = MaterialTheme.typography.titleMedium,
                        fontWeight = FontWeight.Bold
                    )
                    Text(
                        text = news.date,
                        style = MaterialTheme.typography.labelSmall,
                        color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)
                    )
                }
            }
            Spacer(modifier = Modifier.height(8.dp))
            Text(
                text = news.content,
                style = MaterialTheme.typography.bodyMedium
            )
        }
    }
}

@Composable
fun MainScreen() {
    val navController = rememberNavController()
    val items = listOf(
        Screen.Home,
        Screen.Profile
    )

    Scaffold(
        bottomBar = {
            NavigationBar {
                val currentRoute by navController.currentRouteAsState()
                items.forEach { screen ->
                    NavigationBarItem(
                        icon = { Icon(screen.icon, contentDescription = null) },
                        label = { Text(screen.title) },
                        selected = currentRoute == screen.route,
                        onClick = {
                            navController.navigate(screen.route) {
                                popUpTo(navController.graph.startDestinationId)
                                launchSingleTop = true
                            }
                        }
                    )
                }
            }
        }
    ) { innerPadding ->
        NavHost(
            navController = navController,
            startDestination = Screen.Home.route,
            modifier = Modifier.padding(innerPadding)
        ) {
            composable(Screen.Home.route) { HomeScreen() }
            composable(Screen.Profile.route) { ProfileScreen() }
        }
    }
}

// 定义屏幕类型
sealed class Screen(val route: String, val title: String, val icon: ImageVector) {
    object Home : Screen("home", "首页", Icons.Default.Home)
    object Profile : Screen("profile", "个人资料", Icons.Default.Person)
}

// 首页屏幕
@Composable
fun HomeScreen() {
    // 模拟新闻数据
    val newsList = remember {
        listOf(
            NewsItem(
                1,
                "Jetpack Compose 1.0 发布",
                "Google正式发布了Jetpack Compose 1.0版本,这是Android现代UI工具包的重大里程碑...",
                "http://img0.adesk.com/download/57e9b82f94e5cc0a9e3e4148",
                "2023-05-10"
            ),
            NewsItem(
                2,
                "Kotlin 2.0 新特性",
                "Kotlin 2.0带来了多项改进,包括性能提升和新语言特性...",
                "http://img0.adesk.com/download/57e4719c94e5cc3320a842d6",
                "2023-05-08"
            ),
            NewsItem(
                3,
                "Android 14 开发者预览版",
                "Google发布了Android 14的第一个开发者预览版,包含多项新API...",
                "http://img0.adesk.com/download/57e374d094e5cc14c62ac7ff",
                "2023-05-05"
            )
        )
    }

    LazyColumn(
        modifier = Modifier.fillMaxSize(),
        contentPadding = PaddingValues(bottom = 56.dp)
    ) {
        item {
            Text(
                text = "今日新闻",
                style = MaterialTheme.typography.headlineSmall,
                modifier = Modifier.padding(16.dp)
            )
        }
        item { ImageCarousel() }
        items(newsList) { news ->
            NewsListItem(news = news)
        }
    }
}

// 个人资料屏幕
@Composable
fun ProfileScreen() {
    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        Text("个人资料页面")
    }
}

// 扩展函数用于获取当前路由
@Composable
fun NavController.currentRouteAsState(): State<String?> {
    val currentRoute = remember { mutableStateOf(currentBackStackEntry?.destination?.route) }
    DisposableEffect(this) {
        val listener = NavController.OnDestinationChangedListener { _, destination, _ ->
            currentRoute.value = destination.route
        }
        addOnDestinationChangedListener(listener)
        onDispose {
            removeOnDestinationChangedListener(listener)
        }
    }
    return currentRoute
}

@Preview(showBackground = true)
@Composable
fun MainScreenPreview() {
    ComposeDemoTheme {
        MainScreen()
    }
}

上面的图片地址是我从网上找到的,好了,现在再运行一下看看。

虽然有点粗糙,但是功能是有了不是吗?

六、个人资料页面

最后我们再问一个问题,输入:“完善ProfileScreen中的代码,增加头像、昵称、签名、设置、关于、退出登录”,得到如下内容:

我将为ProfileScreen添加完整的个人资料页面布局,包含头像、昵称、签名、设置、关于和退出登录等功能。以下是完善后的代码:

代码语言:javascript
代码运行次数:0
运行
复制
// 个人资料屏幕
@Composable
fun ProfileScreen() {
    // 模拟用户数据
    val user = remember {
        mutableStateOf(
            UserProfile(
                avatarUrl = "https://img0.adesk.com/download/5b1a1f3a7e9e8a2d008b4568",
                nickname = "Compose开发者",
                signature = "专注于Jetpack Compose开发",
                email = "compose@example.com"
            )
        )
    }

    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
    ) {
        // 头像和基本信息
        Box(
            modifier = Modifier.fillMaxWidth(),
            contentAlignment = Alignment.Center
        ) {
            Column(horizontalAlignment = Alignment.CenterHorizontally) {
                Image(
                    painter = rememberAsyncImagePainter(user.value.avatarUrl),
                    contentDescription = "用户头像",
                    modifier = Modifier
                        .size(120.dp)
                        .clip(CircleShape),
                    contentScale = ContentScale.Crop
                )
                Spacer(modifier = Modifier.height(16.dp))
                Text(
                    text = user.value.nickname,
                    style = MaterialTheme.typography.headlineMedium,
                    fontWeight = FontWeight.Bold
                )
                Spacer(modifier = Modifier.height(8.dp))
                Text(
                    text = user.value.signature,
                    style = MaterialTheme.typography.bodyMedium,
                    color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)
                )
            }
        }

        Spacer(modifier = Modifier.height(24.dp))

        // 个人信息卡片
        Card(
            modifier = Modifier.fillMaxWidth(),
            shape = RoundedCornerShape(8.dp)
        ) {
            Column(modifier = Modifier.padding(16.dp)) {
                ProfileItem(
                    icon = Icons.Default.Email,
                    title = "邮箱",
                    value = user.value.email
                )
                Divider(modifier = Modifier.padding(vertical = 8.dp))
                ProfileItem(
                    icon = Icons.Default.DateRange,
                    title = "注册时间",
                    value = "2023-01-15"
                )
            }
        }

        Spacer(modifier = Modifier.height(16.dp))

        // 功能选项
        Card(
            modifier = Modifier.fillMaxWidth(),
            shape = RoundedCornerShape(8.dp)
        ) {
            Column {
                ProfileOptionItem(
                    icon = Icons.Default.Settings,
                    title = "设置",
                    onClick = { /* 处理设置点击 */ }
                )
                Divider()
                ProfileOptionItem(
                    icon = Icons.Default.Info,
                    title = "关于",
                    onClick = { /* 处理关于点击 */ }
                )
                Divider()
                ProfileOptionItem(
                    icon = Icons.Default.ExitToApp,
                    title = "退出登录",
                    onClick = { /* 处理退出登录 */ },
                    tint = MaterialTheme.colorScheme.error
                )
            }
        }
    }
}

// 用户资料数据类
data class UserProfile(
    val avatarUrl: String,
    val nickname: String,
    val signature: String,
    val email: String
)

// 个人信息项组件
@Composable
fun ProfileItem(icon: ImageVector, title: String, value: String) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .padding(vertical = 8.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Icon(
            imageVector = icon,
            contentDescription = null,
            modifier = Modifier.size(24.dp),
            tint = MaterialTheme.colorScheme.primary
        )
        Spacer(modifier = Modifier.width(16.dp))
        Column(modifier = Modifier.weight(1f)) {
            Text(
                text = title,
                style = MaterialTheme.typography.labelMedium,
                color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)
            )
            Text(
                text = value,
                style = MaterialTheme.typography.bodyMedium
            )
        }
    }
}

// 功能选项组件
@Composable
fun ProfileOptionItem(
    icon: ImageVector,
    title: String,
    onClick: () -> Unit,
    tint: Color = MaterialTheme.colorScheme.onSurface
) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .clickable(onClick = onClick)
            .padding(16.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Icon(
            imageVector = icon,
            contentDescription = null,
            modifier = Modifier.size(24.dp),
            tint = tint
        )
        Spacer(modifier = Modifier.width(16.dp))
        Text(
            text = title,
            style = MaterialTheme.typography.bodyLarge,
            modifier = Modifier.weight(1f)
        )
        Icon(
            imageVector = Icons.Default.ArrowForward,
            contentDescription = null,
            modifier = Modifier.size(20.dp),
            tint = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)
        )
    }
}

这个完善后的ProfileScreen包含以下功能:

  1. 用户头像:圆形头像,使用CircleShape裁剪
  2. 基本信息:显示昵称和个性签名
  3. 个人信息卡片
    • 邮箱地址
    • 注册时间
  4. 功能选项
    • 设置选项
    • 关于选项
    • 退出登录(使用错误色突出显示)

注意:

  • 使用了rememberAsyncImagePainter加载网络图片
  • 使用了Card组件创建卡片式布局
  • 添加了分隔线(Divider)增强视觉层次
  • 每个选项都是可点击的(clickable修饰符)
  • 使用了Material Design图标系统

你可能还需要在文件顶部添加以下导入:

代码语言:javascript
代码运行次数:0
运行
复制
import androidx.compose.foundation.clickable
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.filled.ArrowForward
import androidx.compose.material.icons.filled.DateRange
import androidx.compose.material.icons.filled.Email
import androidx.compose.material.icons.filled.ExitToApp
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.Divider
import androidx.compose.ui.graphics.Color

根据上述代码我们添加进去,然后就可以了,这里我们修改了头像的路径即可,修复后的代码如下所示:

1. 完整代码
代码语言:javascript
代码运行次数:0
运行
复制
package com.llw.composedemo

import AutoCarousel
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
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.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowForward
import androidx.compose.material.icons.filled.DateRange
import androidx.compose.material.icons.filled.Email
import androidx.compose.material.icons.filled.ExitToApp
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.State
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
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.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import coil.compose.rememberAsyncImagePainter
import com.llw.composedemo.ui.theme.ComposeDemoTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            ComposeDemoTheme {
                MainScreen()
            }
        }
    }
}

// 首页数据类
data class NewsItem(
    val id: Int,
    val title: String,
    val content: String,
    val imageUrl: String,
    val date: String
)

// 图片轮播组件
@Composable
fun ImageCarousel() {
    val images = listOf(
        "http://img0.adesk.com/download/57e9b82f94e5cc0a9e3e4148",
        "http://img0.adesk.com/download/57e4719c94e5cc3320a842d6",
        "http://img0.adesk.com/download/57e374d094e5cc14c62ac7ff"
    )
    AutoCarousel(
        items = images,
        modifier = Modifier.height(200.dp)
    )
}

// 新闻列表项组件
@Composable
fun NewsListItem(news: NewsItem) {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(8.dp),
        shape = RoundedCornerShape(8.dp)
    ) {
        Column(modifier = Modifier.padding(16.dp)) {
            Row(verticalAlignment = Alignment.CenterVertically) {
                Image(
                    painter = rememberAsyncImagePainter(news.imageUrl),
                    contentDescription = "新闻图片",
                    modifier = Modifier
                        .size(80.dp)
                        .clip(RoundedCornerShape(8.dp)),
                    contentScale = ContentScale.Crop
                )
                Spacer(modifier = Modifier.width(16.dp))
                Column {
                    Text(
                        text = news.title,
                        style = MaterialTheme.typography.titleMedium,
                        fontWeight = FontWeight.Bold
                    )
                    Text(
                        text = news.date,
                        style = MaterialTheme.typography.labelSmall,
                        color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)
                    )
                }
            }
            Spacer(modifier = Modifier.height(8.dp))
            Text(
                text = news.content,
                style = MaterialTheme.typography.bodyMedium
            )
        }
    }
}

@Composable
fun MainScreen() {
    val navController = rememberNavController()
    val items = listOf(
        Screen.Home,
        Screen.Profile
    )

    Scaffold(
        bottomBar = {
            NavigationBar {
                val currentRoute by navController.currentRouteAsState()
                items.forEach { screen ->
                    NavigationBarItem(
                        icon = { Icon(screen.icon, contentDescription = null) },
                        label = { Text(screen.title) },
                        selected = currentRoute == screen.route,
                        onClick = {
                            navController.navigate(screen.route) {
                                popUpTo(navController.graph.startDestinationId)
                                launchSingleTop = true
                            }
                        }
                    )
                }
            }
        }
    ) { innerPadding ->
        NavHost(
            navController = navController,
            startDestination = Screen.Home.route,
            modifier = Modifier.padding(innerPadding)
        ) {
            composable(Screen.Home.route) { HomeScreen() }
            composable(Screen.Profile.route) { ProfileScreen() }
        }
    }
}

// 定义屏幕类型
sealed class Screen(val route: String, val title: String, val icon: ImageVector) {
    object Home : Screen("home", "首页", Icons.Default.Home)
    object Profile : Screen("profile", "个人资料", Icons.Default.Person)
}

// 首页屏幕
@Composable
fun HomeScreen() {
    // 模拟新闻数据
    val newsList = remember {
        listOf(
            NewsItem(
                1,
                "Jetpack Compose 1.0 发布",
                "Google正式发布了Jetpack Compose 1.0版本,这是Android现代UI工具包的重大里程碑...",
                "http://img0.adesk.com/download/57e9b82f94e5cc0a9e3e4148",
                "2023-05-10"
            ),
            NewsItem(
                2,
                "Kotlin 2.0 新特性",
                "Kotlin 2.0带来了多项改进,包括性能提升和新语言特性...",
                "http://img0.adesk.com/download/57e4719c94e5cc3320a842d6",
                "2023-05-08"
            ),
            NewsItem(
                3,
                "Android 14 开发者预览版",
                "Google发布了Android 14的第一个开发者预览版,包含多项新API...",
                "http://img0.adesk.com/download/57e374d094e5cc14c62ac7ff",
                "2023-05-05"
            )
        )
    }

    LazyColumn(
        modifier = Modifier.fillMaxSize(),
        contentPadding = PaddingValues(bottom = 56.dp)
    ) {
        item {
            Text(
                text = "今日新闻",
                style = MaterialTheme.typography.headlineSmall,
                modifier = Modifier.padding(16.dp)
            )
        }
        item { ImageCarousel() }
        items(newsList) { news ->
            NewsListItem(news = news)
        }
    }
}

// 个人资料屏幕
@Composable
fun ProfileScreen() {
    // 模拟用户数据
    val user = remember {
        mutableStateOf(
            UserProfile(
                avatarUrl = "http://img0.adesk.com/download/57e4719c94e5cc3320a842d6",
                nickname = "Compose开发者",
                signature = "专注于Jetpack Compose开发",
                email = "compose@example.com"
            )
        )
    }

    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
    ) {
        // 头像和基本信息
        Box(
            modifier = Modifier.fillMaxWidth(),
            contentAlignment = Alignment.Center
        ) {
            Column(horizontalAlignment = Alignment.CenterHorizontally) {
                Image(
                    painter = rememberAsyncImagePainter(user.value.avatarUrl),
                    contentDescription = "用户头像",
                    modifier = Modifier
                        .size(120.dp)
                        .clip(CircleShape),
                    contentScale = ContentScale.Crop
                )
                Spacer(modifier = Modifier.height(16.dp))
                Text(
                    text = user.value.nickname,
                    style = MaterialTheme.typography.headlineMedium,
                    fontWeight = FontWeight.Bold
                )
                Spacer(modifier = Modifier.height(8.dp))
                Text(
                    text = user.value.signature,
                    style = MaterialTheme.typography.bodyMedium,
                    color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)
                )
            }
        }

        Spacer(modifier = Modifier.height(24.dp))

        // 个人信息卡片
        Card(
            modifier = Modifier.fillMaxWidth(),
            shape = RoundedCornerShape(8.dp)
        ) {
            Column(modifier = Modifier.padding(16.dp)) {
                ProfileItem(
                    icon = Icons.Default.Email,
                    title = "邮箱",
                    value = user.value.email
                )
                Divider(modifier = Modifier.padding(vertical = 8.dp))
                ProfileItem(
                    icon = Icons.Default.DateRange,
                    title = "注册时间",
                    value = "2023-01-15"
                )
            }
        }

        Spacer(modifier = Modifier.height(16.dp))

        // 功能选项
        Card(
            modifier = Modifier.fillMaxWidth(),
            shape = RoundedCornerShape(8.dp)
        ) {
            Column {
                ProfileOptionItem(
                    icon = Icons.Default.Settings,
                    title = "设置",
                    onClick = { /* 处理设置点击 */ }
                )
                Divider()
                ProfileOptionItem(
                    icon = Icons.Default.Info,
                    title = "关于",
                    onClick = { /* 处理关于点击 */ }
                )
                Divider()
                ProfileOptionItem(
                    icon = Icons.Default.ExitToApp,
                    title = "退出登录",
                    onClick = { /* 处理退出登录 */ },
                    tint = MaterialTheme.colorScheme.error
                )
            }
        }
    }
}

// 用户资料数据类
data class UserProfile(
    val avatarUrl: String,
    val nickname: String,
    val signature: String,
    val email: String
)

// 个人信息项组件
@Composable
fun ProfileItem(icon: ImageVector, title: String, value: String) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .padding(vertical = 8.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Icon(
            imageVector = icon,
            contentDescription = null,
            modifier = Modifier.size(24.dp),
            tint = MaterialTheme.colorScheme.primary
        )
        Spacer(modifier = Modifier.width(16.dp))
        Column(modifier = Modifier.weight(1f)) {
            Text(
                text = title,
                style = MaterialTheme.typography.labelMedium,
                color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)
            )
            Text(
                text = value,
                style = MaterialTheme.typography.bodyMedium
            )
        }
    }
}

// 功能选项组件
@Composable
fun ProfileOptionItem(
    icon: ImageVector,
    title: String,
    onClick: () -> Unit,
    tint: Color = MaterialTheme.colorScheme.onSurface
) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .clickable(onClick = onClick)
            .padding(16.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Icon(
            imageVector = icon,
            contentDescription = null,
            modifier = Modifier.size(24.dp),
            tint = tint
        )
        Spacer(modifier = Modifier.width(16.dp))
        Text(
            text = title,
            style = MaterialTheme.typography.bodyLarge,
            modifier = Modifier.weight(1f)
        )
        Icon(
            imageVector = Icons.Default.ArrowForward,
            contentDescription = null,
            modifier = Modifier.size(20.dp),
            tint = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)
        )
    }
}


// 扩展函数用于获取当前路由
@Composable
fun NavController.currentRouteAsState(): State<String?> {
    val currentRoute = remember { mutableStateOf(currentBackStackEntry?.destination?.route) }
    DisposableEffect(this) {
        val listener = NavController.OnDestinationChangedListener { _, destination, _ ->
            currentRoute.value = destination.route
        }
        addOnDestinationChangedListener(listener)
        onDispose {
            removeOnDestinationChangedListener(listener)
        }
    }
    return currentRoute
}

@Preview(showBackground = true)
@Composable
fun MainScreenPreview() {
    ComposeDemoTheme {
        MainScreen()
    }
}

最后我们运行一下看看:

通过CodeBuddy,我们轻轻松松的就写了一个主页面。

七、源码

源码地址:ComposeDemo

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用CodeBuddy提高开发效率
  • 前言
  • 正文
    • 一、创建项目
    • 二、配置工具
    • 三、使用工具
      • 1. 代码分析
      • 2. 需求编写
    • 四、底部导航栏
      • 1. 修改后的 MainActivity.kt
      • 2. 需要添加的依赖 (build.gradle.kts)
      • 3. 代码说明:
    • 五、轮播图和新闻列表
      • 1. 修改后的 MainActivity.kt
      • 2. 需要添加的依赖 (build.gradle.kts)
      • 3. 代码说明:
      • 4. 修正代码
    • 六、个人资料页面
      • 1. 完整代码
    • 七、源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档