我怎么能看到如果endIcon在TextInputLayout检查?



在EndCompoundLayout中有一个isEndIconChecked(),但是我看不到从TextInputLayout到它的任何访问方法。

检查当前是否检查的最好方法是什么?

在我的例子中,我需要一个"Repeat password"输入只有在"password_toggle"未检查结束模式

我查看了源代码,现在使用作为解决方案:

binding.loginPassword.setEndIconOnClickListener {
binding.loginPassword.editText?.apply {
transformationMethod =
if (transformationMethod is PasswordTransformationMethod) null
else PasswordTransformationMethod.getInstance()
binding.repeatPassword.isVisible = transformationMethod != null
}
}

endIcon.isChecked给出警告"只能在同一库组中调用"。


val endIconViewId = resources.getIdentifier(
"text_input_end_icon", 
"id", 
requireActivity().packageName
)
val endIcon: CheckableImageButton = binding.textInputLayout
.findViewById(endIconViewId)
var showClearTextPasswordIsChecked = endIcon.isChecked

如果你想在textInput中添加密码切换,你可以试试这个

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/etPasswordLayout"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.495"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/LogEmail"
app:layout_constraintVertical_bias="0.028"
app:passwordToggleEnabled="true"
android:hint=" ">
<EditText
android:id="@+id/LogPass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/input_background"
android:hint="Password..."
android:textColor="@color/white"
android:textColorHint="@color/white"
android:backgroundTint="@color/f"
android:inputType="textPassword"/>
</com.google.android.material.textfield.TextInputLayout>

更新:结合Vsevolod的回答,我现在使用这个辅助函数:

@SuppressLint("DiscouragedApi", "ClickableViewAccessibility")
private fun registerPasswordCheck(view: TextInputLayout, update: () -> Unit) {
val endIconViewId = resources.getIdentifier(
"text_input_end_icon",
"id",
requireActivity().packageName
)
passwordShownCheck = view.findViewById(endIconViewId)
passwordShownCheck.setOnTouchListener { _, event ->
if (event.actionMasked == MotionEvent.ACTION_DOWN) update()
false
}
}
@SuppressLint("RestrictedApi")
private fun isPasswordShownChecked() = passwordShownCheck.isChecked
private lateinit var passwordShownCheck: CheckableImageButton

可以像这样调用:

registerPasswordCheck(binding.newPassword) {
binding.repeatPassword.isVisible = !isPasswordShownChecked()
}

这样,唯一需要的内部API是text_input_end_icon资源,密码切换的正常行为不必改变。

最新更新