【问题标题】:programmatically change topConstraint of a TextView以编程方式更改 TextView 的 topConstraint
【发布时间】:2019-11-27 19:58:26
【问题描述】:

我只是从 Android 开始我的冒险,所以如果这个问题很愚蠢,请原谅,但我一直在寻找答案很长一段时间都无济于事。问题很简单:我可以通过编程方式更改此参数的值吗?

app:layout_constraintTop_toBottomOf="@+id/divider1"

我要做的很简单:我有一行可见的对象,下面有一个分隔线,下面有一个 TextView,我限制在该分隔线的底部。我还有第二行对象,下面有另一个分隔线,从可见性设置为 GONE 开始,但可以使用浮动操作按钮将其切换为可见。我需要第一行下方的 TextView 向下移动,以便在第二行出现时为其腾出空间。我可以使用 setY,但考虑到这两行是相同的,只是具有不同的值,将 TextView 的顶部约束从“divider1”更改为“divider2”会更容易。可以做到吗?以下是按钮目前的作用:

addButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (!isPair2Visible) {
                    driverLabel2.setVisibility(View.VISIBLE);
                    followerLabel2.setVisibility(View.VISIBLE);
                    driver2.setVisibility(View.VISIBLE);
                    follower2.setVisibility(View.VISIBLE);
                    ratioLabel2.setVisibility(View.VISIBLE);
                    ratio2.setVisibility(View.VISIBLE);
                    divider2.setVisibility(View.VISIBLE);
                    isPair2Visible = true;
                }
            }
        });

这是我需要移动的 TextView:

    <TextView
        android:id="@+id/totalRatio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="@string/ratio_default"
        android:textColor="@color/colorAccentOrange"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="@+id/ratio1"
        app:layout_constraintTop_toBottomOf="@+id/divider1" />

如果我可以将最后一行更改为:

app:layout_constraintTop_toBottomOf="@+id/divider2" /&gt;

【问题讨论】:

  • question 中的答案应该可以满足您的需求。将来请在发布之前在 stackoverflow 上搜索类似的问题。
  • 我确实搜索过类似的问题。而且他们都使用被 Android Studio 文档标记为弃用的解决方案,我无法让他们在 Android Studio 3.5.2 中工作。相信我,我已经测试了十几个使用 ConstraintSet 的解决方案,但我就是无法让它发挥作用。

标签: java android


【解决方案1】:

另一种选择:

ConstraintLayout.LayoutParams textViewParams =
            (ConstraintLayout.LayoutParams) textView.getLayoutParams();
textViewParams.topToBottom = R.id.divider2;
textView.setLayoutParams(textViewParams);

【讨论】:

  • 不客气。其他选项提到了 ConstraintSet... 一次更改多个视图很有用。但是,由于您正在尝试更改单个视图的锚点,我认为这是最简单的方法。
【解决方案2】:

您可以使用ConstraintSet 来做到这一点:

ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(constraintLayout); // parent layout of your TextView
constraintSet.connect(R.id.divider2, ConstraintSet.BOTTOM, R.id.totalRatio,ConstraintSet.TOP, 0);
constraintSet.applyTo(constraintLayout);

【讨论】:

    【解决方案3】:

    尝试使用ConstrainSet

    ConstraintSet constraintSet = new ConstraintSet();
    constraintSet.clone(your_constraint_layout);
    constraintSet.connect(R.id.totalRatio,ConstraintSet.TOP,R.id.divider1,ConstraintSet.TOP,YOUR_DESIRE_MARGIN);
    constraintSet.applyTo(your_constraint_layout);
    

    【讨论】:

      猜你喜欢
      • 2016-04-24
      • 2017-12-02
      • 2016-07-03
      • 2015-01-14
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多