约束视图在setX之后不更新位置

时间:2018-03-12 13:57:23

标签: android android-constraintlayout

我有两个观点,我正在向他们展示一个像这样的观点(他们都是同一个父母的孩子:

<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">

    <View
        android:id="@+id/view1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:background="#00FF00"
        app:layout_constraintTop_toTopOf="parent" />

    <View
        android:id="@+id/view2"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:background="#0000FF"
        app:layout_constraintTop_toBottomOf="@id/view1" />

</android.support.constraint.ConstraintLayout>

一切正常但是当我用setY方法改变view1位置时,view2视图也没有更新它的y位置。 我试图调用invalidate和requestLayout,但没有任何帮助。 如何在设置位置后刷新或更新约束。

4 个答案:

答案 0 :(得分:2)

这有点令人困惑,所以请耐心等待。 setY()执行以下操作:

  

设置此视图的视觉y位置(以像素为单位)。这相当于将translateY属性设置为传入的y值与当前top属性之间的差值。

setTranslationY()执行此操作:

  

设置此视图相对于其顶部位置的垂直位置。除了对象的布局放置它之外,这有效地定位了布局后的对象。

这里的关键词是“将对象置于布局后”。换句话说,作为setY()主题的视图根据布局定位,然后根据setY()的参数移动到新位置。这不会导致另一种布局。实质上,虽然视图出现在新位置,但实际上仍然位于其原始位置。无效并请求另一个布局只会导致翻译后跟随发生相同的布局。

设置上边距为Ben P.建议应该可以移动视图。

答案 1 :(得分:0)

我不确定为什么setY()也不会更新第二个视图,但您可以通过设置第一个视图的上边距而不是调用setY()来解决此问题:

ConstraintLayout.LayoutParams params = 
        (ConstraintLayout.LayoutParams) view1.getLayoutParams();

params.topMargin = 200;
view1.setLayoutParams(params);

答案 2 :(得分:0)

有一种更好的方式(至少对我而言)是以编程方式与ConstraintLayout进行交互。

使用ConstraintSet。将Id设置为根布局,将其初始化为如下所示。

ConstraintLayout constraintLayout = findViewById(R.id.rootLayout);
ConstraintSet set = new ConstraintSet();
set.clone(constraintLayout);  
set.clear(R.id.view2, ConstraintSet.TOP);
set.connect(R.id.view2, ConstraintSet.TOP, R.id.view1, ConstraintSet.BOTTOM, 10); // 10 is the marginTop here
set.applyTo(viewGroupMain);

上面只是示例,您可以根据需要进行修改,这是更改约束和刷新ConstraintLayout的简便方法。

答案 3 :(得分:0)

这是我的解决方案:

只需使用view1移动setTranslationY(),然后将view1 translationY分配给view2

Java示例:

view1.setTranslationY(10f);
view2.setTranslationY(view1.getTranslationY())

科特林版本:

view1.translationY = 10f
view2.translationY = view1.translationY