五、使用Jetpack Compsoe编写一个写小说的Android应用:LazyColumn和ConstraintLayout的使用

前排叠甲:同上一篇。

原本打算这篇写viewModel的,但是它涉及到了很多内容,而且我不太明白,打算先研究研究再说。

本篇则优化一下主界面的视觉效果。

1、LazyColumn的使用

这个玩意查了一下竟然意外的简单,只需要将原来的Column直接改为LazyColumn就成功大半了。我们先定义一个数据,不然一会展示看不出效果。

在MainPage中定义一个数据:

val data = listOf("哈哈","喜喜")

随后改为LazyColumn并嵌套一个函数items:

LazyColumn(
            modifier = Modifier.padding(innerPadding),
        ) {
            items(data){
                Card(),
                ) {}
            }
        }

注意,这里的data就是你的数据集,后面的Card界面直接照搬过来,其中的Text控件中的text属性的值要改为it

Text(text = it)

同时,navController的导航代码也要修改一下,这里的意思就是将data中的对应项传给指定页,同时它传递变量的用法就是${变量}的形式。

navController.navigate("chapter_list_page/${it}")

2、ConstraintLayout的简单使用

原来的行列布局在排布Card中的控件布局时非常笨拙,但是ConstraintLayou却可以用约束来完成这项任务。

首先要添加依赖gradle(app):

implementation ("androidx.constraintlayout:constraintlayout-compose:1.0.1")

之后在Card中新建ConstraintLayout:

ConstraintLayout(modifier = Modifier
                        .fillMaxSize()) {}

当然要确保这个布局填充满整个Card了,所以用了fillMaxSize()

接下来要在ConstraintLayout中创建变量名称,这一步要在ConstraintLayout的括号内写,在外面写无效:

ConstraintLayout(modifier = Modifier
                        .fillMaxSize()) {
                        val (btnRename , fictionName, btnDelete) = createRefs()}

因为Card里面有三个控件所以声明三个变量。

之后修改行列布局,将按钮放进ConstraintLayout然后添加约束:

IconButton(onClick = { },modifier = Modifier
                         .size(50.dp)
                         .constrainAs(btnRename) {
                             top.linkTo(parent.top)
                             bottom.linkTo(parent.bottom)
                             start.linkTo(parent.start, margin = 8.dp)
                                }) {
                            Image(
                                painter = painterResource(id = R.drawable.btn_rename),
                                contentDescription = "add a book"
                            )
                        }

这是ConstraintLayout的一种写法,这个布局比较简单,所以就用这种了。可以看到在modifier中添加了不少东西。

剩下两个控件也一样,直接贴代码了:

IconButton(onClick = { },modifier = Modifier.size(50.dp)
                            .constrainAs(btnDelete) {
                            top.linkTo(parent.top)
                            bottom.linkTo(parent.bottom)
                            end.linkTo(parent.end, margin = 8.dp)
                        }) {
                            Image(
                                painter = painterResource(id = R.drawable.btn_delete),
                                contentDescription = "add a book"
                            )
                        }

                        Text(
                            text = it,
                            modifier = Modifier
                                .padding(8.dp)
                                .constrainAs(fictionName) {
                                    top.linkTo(parent.top)
                                    bottom.linkTo(parent.bottom)
                                    start.linkTo(btnRename.end, margin = 8.dp)
                                    end.linkTo(btnDelete.start)
                                    width = Dimension.fillToConstraints},
                            fontSize = 20.sp
                        )

可以看到Text中多了一个width属性,它有几种模式,这个看英文就知道是填充满约束空间。

接下来给个图:

注意这里对Card的填充方式做了一下改变,这样观感更好一点。

运行的效果如下:

大功告成!

而这里的data就是日后我们要从数据库内取出的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HO灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值