android - 当没有显示错误但结果出乎意料时如何调试 ConstraintSet 错误
问题描述
我正在学习android并做一个简单的计算器。我正在通过迭代这样的运算符标签列表以编程方式构建计算器输入按钮
final String[] inputLabels = {"9", "8", "7", "/", "6" ...}
它将是这样的 4 行 4 列
// please do not mind me about the design
9 8 7 /
6 5 4 x
1 2 3 -
0 AC = +
这些输入将在 下ConstraintLayout
,因为我想学习使用它。但是在讨论如何从我的一维数组中约束这些输入的逻辑之前,我想测试简单的代码(例如创建 2 个按钮并约束它们)是否有效,但事实并非如此,这是我想在这里解决的主要问题。
我已经尝试过谷歌搜索,它们看起来都很简单,奇怪的是我无法实现这么简单的事情,我试图用谷歌搜索我的问题,但我什么也没找到(对不起,如果这些问题存在但我没有找到)
以下是我试图遵循的:
这里是main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="calculatedValue"
type="java.lang.String"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/mainLayout"
tools:context=".MainActivity">
<include
layout="@layout/calculate_value_display"
bind:calculatedValue="@{calculatedValue}" />
<fragment
android:name="com.example.calculator.CalculatorInputs"
android:id="@+id/calculatorInputs"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
</layout>
这calculator_inputs.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".CalculatorInputs"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.constraint.ConstraintLayout
android:id="@+id/calculatorInputs"
android:paddingLeft="10sp"
android:paddingRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.constraint.ConstraintLayout>
</FrameLayout>
这MainActivity.java
就是项目创建时的样子,这里是CalculatorInputs.java
package com.example.calculator;
import android.os.Bundle;
import android.support.constraint.ConstraintLayout;
import android.support.constraint.ConstraintSet;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import java.util.ArrayList;
public final class CalculatorInputs extends Fragment {
private final String[] inputLabels = {"7", "8", "9", "/", "4", "5", "6", "x", "1", "2", "3", "-", "0", "AC", "=", "+"};
private final ConstraintLayout.LayoutParams buttonConstraintLayout =
new ConstraintLayout.LayoutParams(220, 150);
private final float buttonTextSize = 20.f;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.calculator_inputs, container, false);
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ConstraintLayout layout = (ConstraintLayout) view.findViewById(R.id.calulatorInputs);
ConstraintLayout.LayoutParams layoutParams;
final ArrayList<Button> buttons = new ArrayList<Button>(this.inputLabels.length);
while (buttons.size() < this.inputLabels.length) {
buttons.add(null);
}
int buttonIndex = 0;
//////////////////////////////////////////////////////////////////
/////////////////////////// BEGIN HERE ////////////////////////////
//////////////////////////////////////////////////////////////////
final ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(layout);
final Button button1 = this.createButton("X");
final Button button2 = this.createButton("Y");
layout.addView(button1);
constraintSet.connect(
button1.getId(),
ConstraintSet.RIGHT,
ConstraintSet.PARENT_ID,
ConstraintSet.RIGHT
);
constraintSet.connect(
button1.getId(),
ConstraintSet.TOP,
ConstraintSet.PARENT_ID,
ConstraintSet.TOP
);
constraintSet.applyTo(layout);
layout.addView(button2);
constraintSet.connect(
button2.getId(),
ConstraintSet.RIGHT,
ConstraintSet.PARENT_ID,
ConstraintSet.RIGHT
);
constraintSet.connect(
button2.getId(),
ConstraintSet.TOP,
ConstraintSet.PARENT_ID,
ConstraintSet.TOP
);
///////////////////////////////////////////////////////////////////
/////////////////////////// END HERE /////////////////////////////
//////////////////////////////////////////////////////////////////
}
Button createButton(final String buttonLabel) {
final Button button = new Button(this.getActivity());
button.setLayoutParams(this.buttonConstraintLayout);
button.setText(buttonLabel);
button.setTextSize(this.buttonTextSize);
button.setId(View.generateViewId());
return button;
}
}
所以下面是预期的输出和现实:
解决方案
这里的问题是我LayoutParams
为每个按钮创建共享了,这就是它不起作用的原因。
在createButton
方法内部,如果我改成这个,它就可以工作
Button createButton(final String buttonLabel) {
final Button button = new Button(this.getActivity());
button.setLayoutParams(new ConstraintLayout.LayoutParams(220, 150);
button.setText(buttonLabel);
button.setTextSize(this.buttonTextSize);
button.setId(View.generateViewId());
return button;
}
推荐阅读
- python - 如何在 django 中登录和注册用户时验证多个用户
- r - 按行值分组,同时聚合其他单元格值的总值
- c# - EntityFramework 核心子查询
- java - 运行 java 应用程序时遇到问题,它无法按预期执行
- java - 带有基于内容的过滤器的 JMS
- javascript - 如何将 jQuery 插件转换为在 reactjs 中工作?
- python - 使用 Messagebox(或替代它)时避免多个窗口的方法?
- c# - 将 PDF 文件解析到内存并执行搜索特定值
- java - 如何将多个字符串值复制到 android 的剪贴板中?
- java - 来自字符串java的随机数计数