Android 以编程方式将约束添加到约束布局中的视图

Android 以编程方式将约束添加到约束布局中的视图,android,android-constraintlayout,Android,Android Constraintlayout,我正在以编程方式创建文本视图,并将它们添加到约束布局中。默认情况下,它们放置在左上角。我希望它们在彼此下方,第一个在编辑文本下方 这是我的代码: ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.cLayout); ConstraintSet set = new ConstraintSet(); TextView tv = new TextView(this); ConstraintLayout.LayoutParams

我正在以编程方式创建文本视图,并将它们添加到约束布局中。默认情况下,它们放置在左上角。我希望它们在彼此下方,第一个在编辑文本下方

这是我的代码:

ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.cLayout);
ConstraintSet set = new ConstraintSet();
TextView tv = new TextView(this);
ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(
    ConstraintLayout.LayoutParams.WRAP_CONTENT, // Width of TextView
    ConstraintLayout.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(lp);
set.clone(layout);
set.connect(tv.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 8);
set.connect(tv.getId(), ConstraintSet.TOP, editText.getId(), ConstraintSet.BOTTOM, 8);
tv.setId(View.generateViewId());
set.applyTo(layout);
layout.addView(tv,0);

如您所见,我已经设置了从视图顶部到editText底部的约束。不过,它显示在左上角。为什么会这样?

您的代码顺序不正确,下面的代码应该可以工作

ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.cLayout);

TextView tv = new TextView(this);
tv.setText("Something");
tv.setId(View.generateViewId());
ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(
    ConstraintLayout.LayoutParams.WRAP_CONTENT, // Width of TextView
    ConstraintLayout.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(lp);
layout.addView(tv,0);

ConstraintSet set = new ConstraintSet();
set.clone(layout);
set.connect(tv.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 8);
set.connect(tv.getId(), ConstraintSet.TOP, editText.getId(), ConstraintSet.BOTTOM, 8);
set.applyTo(layout);

另外,我同意赛义德·艾哈迈德·贾米尔的观点,你最好使用
RecyclerView
ListView
,但是知道如何正确设置
ConstraintLayout
约束并没有什么坏处。

按照指导原则,始终避免以编程方式添加视图。@SumitShukla但是如果我从网站获取文本标题,而文本视图不可能已经存在,我必须创建它们怎么办?如果我有三个标题,我必须添加三个文本视图。如果我有一个,就只添加一个。只要问一下,如果可以在布局xml文件或使用布局编辑器轻松完成,为什么要在代码中这样做。如果您不在类中添加与UI相关的数据,这会更好much@JouanH.Sulaiman在这种情况下,不需要在运行时创建Textview。只需将Textview保留在需要的位置,并将其文本设置为空字符串。就是这样,当数据出现时,只需将其文本再次设置为您获取的内容。@JouanH.Sulaiman您以何种方式显示文本视图?一份清单,对吗?您需要阅读有关ListView、GridView、RecyclerView和Adpeter视图的内容。这些视图也称为视图组。视图组是指可以包含其他视图并以某种方式排列的视图。ListView将以列表等方式排列其所有包含视图。这些视图从适配器获取数据。适配器将包含一个数据数组,在您的情况下,该数组是获取的文本。阅读这里,非常感谢。如果我添加了许多文本视图,并且希望每个连续的文本视图都低于前面的文本视图,该怎么办?有没有办法解决这个问题?您可以保留为文本视图生成的ID,并使用该ID而不是
editText.getId()
。您应该使用
回收视图
列表视图
,而不是这样做,它们的可扩展性更好,更易于维护和设计(以满足您的需求)。