java - Android Studio 约束集没有为以编程方式添加的视图设置约束
问题描述
我有一个布局,当我专注于 TexInputEditText 时,我需要向其中添加一个视图。我尝试以编程方式创建一个 textview,为它设置了一个 id,然后我继续使用约束集克隆我的约束布局约束。问题是,当我使用 constraintset.connect 为添加的 textview 设置约束时,无论我放什么,textview 的约束都将始终为 0,0,我无法绕过它。这是代码:
xml布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.ParametersList">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/headerLayoutParameters"
android:layout_width="match_parent"
android:layout_height="69dp"
android:background="@color/dark"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/parametri"
android:textColor="@color/white"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintParamList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/headerLayoutParameters"
>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputLayout23"
style="@style/customInputText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/paramAnamnesi"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/back_light"
android:drawableLeft="@drawable/parameters_icon"
android:drawableRight="@drawable/options_icon_points"
android:drawablePadding="25dp"
android:inputType="none"
android:text="@string/anamnesi"
android:textColor="@color/dark"
android:textStyle="bold" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputLayout24"
style="@style/customInputText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintTop_toBottomOf="@+id/textInputLayout23"
tools:layout_editor_absoluteX="16dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/paramsPlica"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/back_light"
android:drawableLeft="@drawable/parameters_icon"
android:drawableRight="@drawable/options_icon_points"
android:drawablePadding="25dp"
android:text="@string/plica"
android:inputType="none"
android:textColor="@color/dark"
android:textSize="14sp"
android:textStyle="bold" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputLayout25"
style="@style/customInputText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintTop_toBottomOf="@+id/textInputLayout24"
tools:layout_editor_absoluteX="16dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/paramsMisureAntro"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/back_light"
android:drawableLeft="@drawable/parameters_icon"
android:drawableRight="@drawable/options_icon_points"
android:drawablePadding="25dp"
android:text="@string/misure_antropometriche"
android:inputType="none"
android:textColor="@color/dark"
android:textSize="14sp"
android:textStyle="bold" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputLayout26"
style="@style/customInputText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintTop_toBottomOf="@+id/textInputLayout25"
tools:layout_editor_absoluteX="16dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/paramsNote"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/back_light"
android:drawableLeft="@drawable/parameters_icon"
android:drawableRight="@drawable/options_icon_points"
android:drawablePadding="25dp"
android:text="@string/note"
android:textColor="@color/dark"
android:inputType="none"
android:textSize="14sp"
android:textStyle="bold" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/addParamsLayout"
style="@style/customInputText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintTop_toBottomOf="@+id/textInputLayout26">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/paramsAddParam"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/back_light"
android:drawableLeft="@drawable/add_person"
android:drawableRight="@drawable/options_icon_points"
android:drawablePadding="25dp"
android:text="@string/aggiungi_personalizzato"
android:textColor="@color/dark"
android:inputType="none"
android:textSize="14sp"
android:textStyle="bold" />
</com.google.android.material.textfield.TextInputLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Java代码:
ConstraintLayout constraintLayout;
constraintLayout=findViewById(R.id.constraintParamList);
textInputEditText5.setOnFocusChangeListener(new View.OnFocusChangeListener() { //AGGIUNTA DINAMICA LAYOUT PER NEW PARAM
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(textInputEditText5.isFocused()){
EditText editText=new EditText(getApplicationContext());
editText.setText("ADDED PARAMETER");
ConstraintSet constraintSet=new ConstraintSet();
int idCreato=8;
editText.setId(idCreato);
ConstraintLayout.LayoutParams addedParams= new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT
);
editText.setLayoutParams(addedParams);
constraintLayout.addView(editText);
constraintSet.clone(constraintLayout);
constraintSet.connect(idCreato, ConstraintSet.TOP,R.id.paramsAddParam, ConstraintSet.BOTTOM, 16);
constraintSet.applyTo(constraintLayout);
//TODO FAR FUNZIONARE AGGIUNTA DINAMICA LAYOUT PARAMETRI
}else{
}
}
});
解决方案
约束只能应用于ConstraintLayout的直接子级。您正在尝试将新视图与TextInputEditText连接,该 TextInputEditText是 TextInputLayout 的子级。代替
constraintSet.connect(idCreato, ConstraintSet.TOP,R.id.paramsAddParam, ConstraintSet.BOTTOM, 16);
尝试
constraintSet.connect(idCreato, ConstraintSet.TOP,R.id.addParamsLayout, ConstraintSet.BOTTOM, 16);
看看是否有帮助。
推荐阅读
- types - 无法在 F# 函数中获取匹配的类型
- firebase - 如何修复 Firebase Auth 仅在刷新后工作?
- authentication - 是否可以通过 REST api 对 .Net Core 应用程序使用 Umbraco 身份验证?我了解 Umbraco 本身不符合 .Net 核心
- google-apps-script - 如何将 JSON 信息提取到谷歌表格
- python-3.x - Adding columns to an existing Pandas DataFrame from a list of arrays
- javascript - 角度限制到条件
- google-api - 服务器端应用程序的 Google 登录:将有效授权代码交换为令牌 - 错误请求错误(错误:redirect_uri_mismatch)
- django - 在 Django 中防止恶意 PNG
- scala - org.apache.spark.SparkException:作业因阶段失败而中止:阶段 11.0 中的任务 98 失败 4 次
- python - 是否可以用python拦截按键?