android - 为自定义视图的每个不同实例在自定义视图中为 EditText 提供唯一 ID
问题描述
我有一个自定义视图 ProfileInputView
profile_input_view.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="28dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="28dp"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:orientation="vertical">
<TextView
android:id="@+id/label_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:fontFamily="sans-serif"
android:textAllCaps="true"
android:textColor="@color/oppiaPrimaryText"
android:textSize="12sp" />
<EditText
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:background="@drawable/add_profile_edit_text_background"
android:fontFamily="sans-serif"
android:padding="8dp"
android:textColor="@color/oppiaPrimaryText"
android:textSize="14sp"
android:textStyle="italic" />
<TextView
android:id="@+id/error_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/red" />
</LinearLayout>
</layout>
我在这个布局中创建了两个 ProfileInputView 实例
admin_pin_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:profile="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="org.oppia.app.profile.AdminPinViewModel" />
</data>
<ScrollView
android:id="@+id/scrollViewAdminPin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/addProfileBackground">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/admin_auth_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/addProfileBackground">
<TextView
android:id="@+id/admin_pin_main_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/admin_pin_requirement_description"
android:textColor="@color/oppiaPrimaryText"
android:textSize="16sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="32dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"/>
<TextView
android:id="@+id/admin_pin_warning_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/admin_pin_pin_description"
android:textSize="16sp"
android:textColor="@color/oppiaPrimaryText"
app:layout_constraintTop_toBottomOf="@+id/admin_pin_main_text"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"/>
<org.oppia.app.profile.ProfileInputView
android:id="@+id/input_pin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/admin_pin_warning_text"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:label="@string/admin_pin_new_pin"
app:isPasswordInput="true"
app:inputLength="5"
profile:error="@{viewModel.pinErrorMsg}"/>
<org.oppia.app.profile.ProfileInputView
android:id="@+id/input_confirm_pin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/input_pin"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:label="@string/admin_pin_new_confirm"
app:isPasswordInput="true"
app:inputLength="5"
profile:error="@{viewModel.confirmPinErrorMsg}"/>
<Button
android:id="@+id/submit_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/admin_pin_submit"
style="@style/StateButtonActive"
app:layout_constraintTop_toBottomOf="@+id/input_confirm_pin"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="20dp"
android:layout_marginEnd="32dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</layout>
如何为每个 ProfileInputView 的 EditText 字段提供唯一的 ID。
基本上,当我切换屏幕的方向时,每个实例都具有相同的文本值,因为它们的 EditText 具有相同的 id。所以我想为每个实例的 EditText 提供唯一的 id。
解决方案
你可以创建一个额外的 attr
<declare-styleable name="ProfileInputView">
<attr name="extra_id_input1" format="int" />
<attr name="extra_id_input2" format="int" />
<attr name="extra_id_input3" format="int" />
</declare-styleable>
从您的自定义 ProfileInputView 调用它,如下所示:
<org.oppia.app.profile.ProfileInputView
android:id="@+id/input_confirm_pin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/input_pin"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:label="@string/admin_pin_new_confirm"
app:isPasswordInput="true"
app:inputLength="5"
app:extra_id_input1 = "1"
app:extra_id_input1 = "2"
app:extra_id_input1 = "3"
profile:error="@{viewModel.confirmPinErrorMsg}"/>
并在您的组件方面执行以下操作:
init {
// ...
label_text.id = attributeArray.getInt(R.styleable.ProfileInputView_extra_id_input1,0)
input.id = attributeArray.getInt(R.styleable.ProfileInputView_extra_id_input2,0)
error_text.id = attributeArray.getInt(R.styleable.ProfileInputView_extra_id_input3,0)
// ...
}
实现这一点的正确方法可能是为 EditText 和TextView使用自定义组件以避免许多额外的ids,因此最后可以执行以下操作:
init {
//...
label_text.id = this.id
input.id = this.id
//..
}
推荐阅读
- java - (Google Maps API - 反向地理编码)获取城市数据为空(例如,巴西城市)
- python - 可以使用第一个函数访问另一个函数内的函数内声明的列表,但不使用全局属性就不能访问变量
- python - 如何在 Docker 容器中运行 pdb
- php - 在一行中显示多行
- python - 这个批处理 FOR 命令如何转换为 python?
- python - 如何在数据框中显示所有列内容
- angular - 如何在没有角度的其他网站上使用量角器进行 E2E 测试?
- python - 您可以在 SQL SERVER 2016 中将 Python 与 MS 机器学习一起使用吗
- postgresql - Postgres 在使用 OR 过滤器时使用低效的查询计划,在使用 IN 子句时使用正确的索引
- vb.net - 我需要查看什么来解决此打印问题