【发布时间】:2018-06-12 10:30:47
【问题描述】:
我在 ScrollView 中有一个 Android ConstraintLayout。 我在布局中添加了几个按钮和一个 ImageView。其中一个按钮应限制在 ImageView 的底部。
这里出现了问题:一旦我将图像设置为调整到视图的边界(setAdjustViewBounds),图像就会完全按照我想要的方式调整大小,但是应该跟随 ImageView 的按钮被绘制在底部图像,而不是它的下方。
查看以下输出: This is how it looks
当我再添加一个按钮时,其定义必须遵循 ImageView 定义,然后一切看起来都很好,即使它的约束与图像约束无关。如果我在 ImageView 定义之前移动附加按钮的定义,我会再次得到错误的输出,当然还有一个附加按钮。
这是正确的输出: And this is how it should look
但我不想在 ImageView 之后添加任何额外的声明,只是为了使布局工作。
有没有人知道,这里出了什么问题?
这是我的代码产生了 button2 的错误位置(测试 2):
public class MainActivity extends AppCompatActivity {
int id = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ScrollView sv = new ScrollView(this);
sv.setId(id++);
ConstraintLayout mainLayout = new ConstraintLayout(this);
mainLayout.setId(id++);
mainLayout.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Button button = new Button(this);
button.setId(id++);
button.setText("Test");
mainLayout.addView(button);
Button button1 = new Button(this);
button1.setId(id++);
button1.setText("Test 1");
mainLayout.addView(button1);
ImageView image = new ImageView(this);
image.setId(id++);
image.setImageResource(R.drawable.img);
image.setBackgroundColor(Color.parseColor("#0000FF"));
image.setLayoutParams(new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_CONSTRAINT, ConstraintLayout.LayoutParams.WRAP_CONTENT));
image.setAdjustViewBounds(true);
mainLayout.addView(image);
Button button2 = new Button(this);
button2.setId(id++);
button2.setText("TEST 2");
mainLayout.addView(button2);
//getFragmentManager().beginTransaction().add(sv.getId(), BlankFragment.newInstance("Inhalt 1"), "someTag1").commit();
sv.addView(mainLayout);
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(mainLayout);
constraintSet.constrainWidth(button.getId(), constraintSet.MATCH_CONSTRAINT);
constraintSet.connect(button.getId(), ConstraintSet.TOP, mainLayout.getId(), ConstraintSet.TOP, 10);
constraintSet.connect(button.getId(), ConstraintSet.START, mainLayout.getId(), ConstraintSet.START, 50);
constraintSet.connect(button.getId(), ConstraintSet.END, mainLayout.getId(), ConstraintSet.END, 50);
constraintSet.constrainWidth(button1.getId(), constraintSet.MATCH_CONSTRAINT);
constraintSet.connect(button1.getId(), ConstraintSet.TOP, button.getId(), ConstraintSet.BOTTOM, 10);
constraintSet.connect(button1.getId(), ConstraintSet.START, button.getId(), ConstraintSet.START, 0);
constraintSet.connect(button1.getId(), ConstraintSet.END, button.getId(), ConstraintSet.END, 700);
constraintSet.constrainWidth(image.getId(), constraintSet.MATCH_CONSTRAINT);
constraintSet.connect(image.getId(), ConstraintSet.TOP, button1.getId(), ConstraintSet.BOTTOM, 10);
constraintSet.connect(image.getId(), ConstraintSet.START, button.getId(), ConstraintSet.START, 100);
constraintSet.connect(image.getId(), ConstraintSet.END, button.getId(), ConstraintSet.END, 100);
constraintSet.constrainWidth(button2.getId(), constraintSet.MATCH_CONSTRAINT);
constraintSet.connect(button2.getId(), ConstraintSet.TOP, image.getId(), ConstraintSet.BOTTOM, 10);
constraintSet.connect(button2.getId(), ConstraintSet.START, button.getId(), ConstraintSet.START, 0);
constraintSet.connect(button2.getId(), ConstraintSet.END, button.getId(), ConstraintSet.END, 0);
constraintSet.connect(button2.getId(), ConstraintSet.BOTTOM, mainLayout.getId(), ConstraintSet.BOTTOM, 10);
constraintSet.applyTo(mainLayout);
setContentView(sv);
}
}
这里是带有附加按钮的代码,它将 button2 移动到正确的位置。没什么特别的,就是多了个按钮。
公共类 MainActivity 扩展 AppCompatActivity {
int id = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ScrollView sv = new ScrollView(this);
sv.setId(id++);
ConstraintLayout mainLayout = new ConstraintLayout(this);
mainLayout.setId(id++);
mainLayout.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Button button = new Button(this);
button.setId(id++);
button.setText("Test");
mainLayout.addView(button);
Button button1 = new Button(this);
button1.setId(id++);
button1.setText("Test 1");
mainLayout.addView(button1);
ImageView image = new ImageView(this);
image.setId(id++);
image.setImageResource(R.drawable.img);
image.setBackgroundColor(Color.parseColor("#0000FF"));
image.setLayoutParams(new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_CONSTRAINT, ConstraintLayout.LayoutParams.WRAP_CONTENT));
image.setAdjustViewBounds(true);
mainLayout.addView(image);
//Even when button3 is left inside the example, but its declaration (next four lines) are moved above the imageview-initialization, the error occurs
Button button3 = new Button(this);
button3.setId(id++);
button3.setText("Test 3");
mainLayout.addView(button3);
Button button2 = new Button(this);
button2.setId(id++);
button2.setText("TEST 2");
mainLayout.addView(button2);
//getFragmentManager().beginTransaction().add(sv.getId(), BlankFragment.newInstance("Inhalt 1"), "someTag1").commit();
sv.addView(mainLayout);
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(mainLayout);
constraintSet.constrainWidth(button.getId(), constraintSet.MATCH_CONSTRAINT);
constraintSet.connect(button.getId(), ConstraintSet.TOP, mainLayout.getId(), ConstraintSet.TOP, 10);
constraintSet.connect(button.getId(), ConstraintSet.START, mainLayout.getId(), ConstraintSet.START, 50);
constraintSet.connect(button.getId(), ConstraintSet.END, mainLayout.getId(), ConstraintSet.END, 50);
constraintSet.constrainWidth(button1.getId(), constraintSet.MATCH_CONSTRAINT);
constraintSet.connect(button1.getId(), ConstraintSet.TOP, button.getId(), ConstraintSet.BOTTOM, 10);
constraintSet.connect(button1.getId(), ConstraintSet.START, button.getId(), ConstraintSet.START, 0);
constraintSet.connect(button1.getId(), ConstraintSet.END, button.getId(), ConstraintSet.END, 700);
constraintSet.constrainWidth(image.getId(), constraintSet.MATCH_CONSTRAINT);
constraintSet.connect(image.getId(), ConstraintSet.TOP, button1.getId(), ConstraintSet.BOTTOM, 10);
constraintSet.connect(image.getId(), ConstraintSet.START, button.getId(), ConstraintSet.START, 100);
constraintSet.connect(image.getId(), ConstraintSet.END, button.getId(), ConstraintSet.END, 100);
constraintSet.constrainWidth(button3.getId(), constraintSet.MATCH_CONSTRAINT);
constraintSet.connect(button3.getId(), ConstraintSet.TOP, button.getId(), ConstraintSet.BOTTOM, 10);
constraintSet.connect(button3.getId(), ConstraintSet.START, button.getId(), ConstraintSet.START, 700);
constraintSet.connect(button3.getId(), ConstraintSet.END, button.getId(), ConstraintSet.END, 0);
constraintSet.constrainWidth(button2.getId(), constraintSet.MATCH_CONSTRAINT);
constraintSet.connect(button2.getId(), ConstraintSet.TOP, image.getId(), ConstraintSet.BOTTOM, 10);
constraintSet.connect(button2.getId(), ConstraintSet.START, button.getId(), ConstraintSet.START, 0);
constraintSet.connect(button2.getId(), ConstraintSet.END, button.getId(), ConstraintSet.END, 0);
constraintSet.connect(button2.getId(), ConstraintSet.BOTTOM, mainLayout.getId(), ConstraintSet.BOTTOM, 10);
constraintSet.applyTo(mainLayout);
setContentView(sv);
}
}
【问题讨论】:
-
您使用的是哪个版本的
ConstraintLayout? -
我无法重现您的结果。尝试使用View#generateViewId() 而不是
id++,以防发生冲突。 (我认为这不太可能,但无论如何都值得一试和更好的方法。)这需要 API 17+。 -
感谢 Cheticamp,您检查版本的提示非常好。我更新到最新版本(1.1.0-beta4),现在一切正常。我的是 1.0.2。
标签: imageview android-constraintlayout