EditText 中的 DrawableButton 为 Show/Hide Password 并更改 DrawableEnd

DrawableButton in EditText to Show/Hide Password and change DrawableEnd

这是 activity_register.xml :

<EditText
    android:id="@+id/editTextTextPassword"
    android:layout_width="346dp"
    android:layout_height="49dp"
    android:layout_marginTop="32dp"
    android:drawableStart="@drawable/ic_vpn_key"
    android:drawableEnd="@drawable/ic_visibility"
    android:ems="10"
    android:hint="@string/password_hint"
    android:inputType="textPassword"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.502"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/editTextTextEmailAddress" />

所以,

我有密码EditText

当您单击 drawableEnd 时,您应该会看到密码并且 drawable 应该会更改为另一个密码,然后再次隐藏密码。

我找到了可以显示密码的教程 -> 有效
_________________________change 可绘制对象 -> 无效
但是,我在 kotlin

的可绘制对象中找不到 onClickListener 的教程

问题短
单击可绘制对象时显示密码的代码,如果再次单击它,密码将再次隐藏。

你想要的是来自 Material Componenets 的 TextInputLayout

操作方法如下:

  • 在您的 build.gradle(app) 文件中实施 Material 库,如下所示:

    implementation 'com.google.android.material:material:1.3.0-alpha01'
    
  • 然后,将 XML 的 EditText 更改为

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/passwordLayout"
        style="@style/TextInputLayoutAppearanceFilled"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:hint="@string/password"
    
        app:endIconMode="password_toggle" //This is used to set the password toggle behavior
    
        app:startIconDrawable="@drawable/ic_lock_black_24dp">
    
        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPassword"
            android:textSize="@dimen/_12ssp" />
    
    </com.google.android.material.textfield.TextInputLayout>
    
  • 然后,根据需要在 styles.xml 中更改样式:

     <style name="TextInputLayoutAppearanceFilled" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
     <item name="hintTextAppearance">@style/HintText</item>
     <item name="helperTextTextAppearance">@style/HelperText</item>
    
     <item name="android:textColor">@color/dark_grey</item>
     <item name="android:textColorHint">@color/color</item>
     <item name="hintTextColor">@color/color</item>
     <item name="boxStrokeColor">@color/color</item>
     <item name="startIconTint">@color/color</item>
     <item name="endIconTint">@color/color</item>
     <item name="boxBackgroundColor">@color/white</item>
    
     <item name="boxCornerRadiusBottomEnd">@dimen/_26sdp</item>
     <item name="boxCornerRadiusBottomStart">@dimen/_26sdp</item>
     <item name="boxCornerRadiusTopEnd">@dimen/_26sdp</item>
     <item name="boxCornerRadiusTopStart">@dimen/_26sdp</item>
    
     <item name="boxStrokeWidthFocused">0dp</item>
    
     <!--This destroys the visible layout in layout editor so  first
     comment this out to design-->
     <!--<item name="boxStrokeWidth">0dp</item>-->
    
     <item name="hintEnabled">true</item>
    
     </style>
    
  • 输出结果如下:

密码切换将完全按照您的需要工作,而且图标也会更改为另一个。您可以根据需要进一步自定义它,请先查看官方文档 - TextInputLayout

只需使用 Material 组件库提供的 TextInputLayout 和密码切换结束图标:

<com.google.android.material.textfield.TextInputLayout
        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
        app:startIconDrawable="@drawable/..."
        app:endIconMode="password_toggle"
        android:hint="Password">

        <com.google.android.material.textfield.TextInputLayout
            android:inputType="textPassword"
            .../>

</com.google.android.material.textfield.TextInputLayout>