【问题标题】:Imitate TableLayout with ConstraintLayout用 ConstraintLayout 模仿 TableLayout
【发布时间】:2017-08-09 04:00:34
【问题描述】:

我想用 ConstraintLayout 来做这个布局。

但我什至没有做它的1(绿色)部分。

我所做的是添加 3 个 TextViews 1,2 和 3(粉红色)将它们连接到父级的左侧,并告诉它们一个在另一个之下。它有效。

然后我需要添加视图 4 和 5,使其始终位于 2 和 3 的右侧,并且其内容必须垂直对齐左边缘,如图所示。

我添加时的问题

 app:layout_constraintLeft_toRightOf="2 OR 3" 

4 和 5 中的文字没有正确对齐。我明白了

当我使用指南时,我得到了这个

 app:layout_constraintLeft_toRightOf="@id/guideline"

有谁知道有什么可以帮忙的吗?

编辑。附言第一次尝试的布局

 <android.support.constraint.ConstraintLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:padding="16dp"
 android:id="@+id/constraintLayout"
 >

<TextView
    android:id="@+id/instrument_name"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:text="AUDUSD"
    app:layout_constraintStart_toStartOf="@+id/constraintLayout"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"/>

<TextView
    android:id="@+id/trade_action_label"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="BUYjhkjhkjhvg"
    app:layout_constraintStart_toStartOf="@+id/instrument_name"
    app:layout_constraintTop_toBottomOf="@id/instrument_name"
    tools:layout_editor_absoluteX="16dp"
    android:layout_marginTop="1dp"/>

<TextView
    android:id="@+id/net_pl"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Net p/l"
    app:layout_constraintStart_toStartOf="@+id/trade_action_label"
    app:layout_constraintTop_toBottomOf="@id/trade_action_label"/>

<TextView
    android:id="@+id/record_amount"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="123"
    app:layout_constraintTop_toTopOf="@id/trade_action_label"
    app:layout_constraintLeft_toRightOf="@id/trade_action_label"
    tools:layout_editor_absoluteY="33dp"
    />

<TextView
    android:id="@+id/pl_value"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="12"
    app:layout_constraintTop_toTopOf="@id/net_pl"
    app:layout_constraintLeft_toRightOf="@id/net_pl"/>
 </android.support.constraint.ConstraintLayout>

编辑。 (结果应该是什么样子的屏幕截图)

【问题讨论】:

  • 显示您的布局 - 让您最接近您想要的布局。
  • @Cheticamp 这些布局都没有给我我想要的东西(请指定你想看哪一个)。
  • 我们试试第一个。
  • @Cheticamp 已编辑

标签: android android-layout layout android-constraintlayout


【解决方案1】:

您可以使用Barrier 来复制TableLayout 的行为。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:text="@string/warehouse"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

  <TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="16dp"
    android:layout_marginTop="8dp"
    android:text="@string/hospital"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView1" />

  <android.support.constraint.Barrier
    android:id="@+id/barrier7"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:barrierDirection="end"
    app:constraint_referenced_ids="textView2,textView1" />

  <TextView
    android:id="@+id/textView3"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:text="@string/lorem_ipsum"
    app:layout_constraintStart_toEndOf="@+id/barrier7"
    app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

更多信息在这里:https://constraintlayout.com/basics/barriers.html

【讨论】:

    【解决方案2】:

    我仔细研究了您要执行的操作。我认为您需要考虑在ConstraintLayout 中使用加权链。请参阅文档here

    确保使用实现链的ConstraintLayout 版本。


    更新

    这是您尝试执行的操作的示例。我已经简化了你的布局,以更好地展示什么会起作用。注意 box1box2 和 box3box4 的交叉链接。这些链接建立了链条。

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/constraintLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="81dp">
    
    <TextView
        android:id="@+id/box1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="16dp"
        android:text="Text box 1 xxxxxxx"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/box2"
        app:layout_constraintTop_toTopOf="parent" />
    
    <TextView
        android:id="@id/box2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="0dp"
        android:text="Text box 2 yyyyyyyyyy"
        app:layout_constraintLeft_toRightOf="@id/box1"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@id/box1" />
    
    <TextView
        android:id="@+id/box3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="0dp"
        android:text="Text box 3 zzzz"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/box4"
        app:layout_constraintTop_toBottomOf="@id/box1" />
    
    <TextView
        android:id="@id/box4"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="0dp"
        android:text="Text box 4"
        app:layout_constraintLeft_toRightOf="@id/box3"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@id/box3" />
    
    </android.support.constraint.ConstraintLayout>
    

    这是布局的图像

    使用app:layout_constraintHorizontal_weight 来影响每个视图获得多少空间。

    【讨论】:

    • 我使用指南来对齐视图 4 和 5。视图 1,2 和 3 在它们之间正确对齐。但是我不能将约束放在指南中,因此它会从视图 2 或 3 向右移动,以防文本不适合指南之前。据我了解,我需要在它们之间连接 4 和 5 的 LEFT(垂直对齐)并连接到 2 和 3 视图..
    • @Lanitka 查看答案的更新。我希望这会有所帮助。
    • @Lanitka 我错过了你之前的评论。你想清楚了吗?
    • 感谢您的回答——非常有帮助!使用您的解决方案,我设法复制了一个完美的 TableLayout,它现在有第一部分和第三部分(参见我的第一张图片)。唯一剩下的是第二(中间)部分。你知道如何做到这一点吗?
    • @Lanitka 如果你的意思是中间的空盒子和大绿色“2”,我会把左边的盒子、中间的盒子和右边的盒子分别包裹在一个 ConstraintLayout 中,并在它们之间建立一个链他们就像我们对TextViews 所做的那样。中间的框只是一个空的ConstraintLayout
    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2011-03-21
    • 2014-05-15
    相关资源
    最近更新 更多