我有两个观点,我正在向他们展示一个像这样的观点(他们都是同一个父母的孩子:
<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,但没有任何帮助。 如何在设置位置后刷新或更新约束。
答案 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