Jetpack 中的权重组成

Posted

技术标签:

【中文标题】Jetpack 中的权重组成【英文标题】:Weights in Jetpack compose 【发布时间】:2020-02-27 05:19:55 【问题描述】:

是否可以在 Jetpack Compose 中做权重?例如,我想将其设置为一个项目的权重为布局的 1/3,而另一个占据剩余的 2/3。

在 XML/ViewGroup 样式中,您可以使用 LinearLayouts 和 ConstraintLayouts 来实现这一点。然而,令我沮丧的是,使用 Jetpack Compose 似乎是不可能的。

示例

在 ConstraintLayout 中,这样做如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <View
        android:layout_
        android:layout_
        android:id="@+id/red"
        android:background="@color/red"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/blue"
        app:layout_constraintHorizontal_weight="1"/>
    <View
        android:layout_
        android:layout_
        android:id="@+id/blue"
        android:background="@color/blue"
        app:layout_constraintStart_toEndOf="@id/red"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_weight="2"/>
</androidx.constraintlayout.widget.ConstraintLayout>

在 LinearLayouts 中,这是按如下方式完成的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="horizontal">
    <View
        android:layout_
        android:layout_
        android:id="@+id/red"
        android:background="@color/red"
        android:layout_weight="1"/>
    <View
        android:layout_
        android:layout_
        android:id="@+id/blue"
        android:background="@color/blue"
        android:layout_weight="2"/>
</LinearLayout>

我知道您可以使用表格来获得均匀分布的东西,但我想要一个不均匀分布。

【问题讨论】:

【参考方案1】:

您可以使用Modifier.weight 比如:

Row() 
    Column(
        Modifier.weight(1f).background(Blue))
        Text(text = "Weight = 1", color = Color.White)
    
    Column(
        Modifier.weight(2f).background(Yellow)
    ) 
        Text(text = "Weight = 2")
    

【讨论】:

哦,使用 Modifier.weight 是我最喜欢的新方法 :) 这应该被标记为正确答案。完美运行!【参考方案2】:

由于“0.1.0-dev09”修饰符在界面上移动,您可以使用

Modifier.weight(float, boolean)

对未加权子元素测量后剩余的垂直/水平空间进行划分,并根据这个权重分配

 Column 
        Row(modifier = Modifier.weight(2.0f, true)) 
            Box (
                modifier = Modifier.fillMaxWidth().fillMaxHeight(),
                backgroundColor = Color.Red
            )
        
        Row(modifier = Modifier.weight(1.0f, true)) 
            Box (
                modifier = Modifier.fillMaxWidth().fillMaxHeight(),
                backgroundColor = Color.Blue,
                gravity = ContentGravity.Center
            ) 
                Text(text = "A sample text")
            
        
        Row(modifier = Modifier.weight(2.0f, true)) 
            Box (
                modifier = Modifier.fillMaxWidth().fillMaxHeight(),
                backgroundColor = Color.Yellow
            )
        
    

【讨论】:

默认值为true,不需要这么指定【参考方案3】:

Jetpack Compose 的“0.1.0-dev04”版本包含更改,FlexRow 已弃用。我可以提出以下解决方案:

Row 
    Card(modifier = LayoutFlexible(1f), color = Color.Red) 
        Container(expanded = true, height = 50.dp) 

        
    
    Card(modifier = LayoutFlexible(2f), color = Color.Green) 
        Container(expanded = true, height = 50.dp) 

        
    

结果:

LayoutFlexible(flex = _f) 帮助我们解决了这个问题,Modifier 可以应用于任何容器。

【讨论】:

【参考方案4】:

对容器内的对象使用 Modifier.weight(float)。 您还可以使用 constraintlayout 或 Low Level Layout Composable。查看 compose 路径中的官方 compose 布局代码实验室,了解更多信息

【讨论】:

以上是关于Jetpack 中的权重组成的主要内容,如果未能解决你的问题,请参考以下文章

相对于jetpack中的其他元素创建垂直链组成ConstraintLayout?

JetpackJetpack 简介 ( 官方架构设计标准 | Jetpack 组成套件 | Jetpack架构 | Jetpack 的存在意义 | AndroidX 与 Jetpack 的关系 )

Jetpack 组成没有片段的导航架构?

Jetpack 在 LazyCloumn 中组成 LazyColumn

如何在jetpack compose中的网格项目之间添加空格

Android Jetpack学习之旅--> 开始使用 Jetpack