【问题标题】:Change EditText password mask character to asterisk (*)将 EditText 密码掩码字符更改为星号 (*)
【发布时间】:2012-12-12 16:23:34
【问题描述】:

有什么方法可以将密码文本从点(.)更改为星号(*)。

密码正在编辑文本中输入。

<EditText
        android:id="@+id/passWord1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:inputType="number"
        android:password="true"/>

【问题讨论】:

标签: android android-edittext


【解决方案1】:

在您的 xml 文件中插入编辑文本,

<EditText
    android:id="@+id/passWordEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:inputType="textPassword"/>

你的类文件继续从edittext获取findViewById并为此实现,

EditText edittext = (EditText)findViewById(R.id.passWordEditText);
edittext.setTransformationMethod(new AsteriskPasswordTransformationMethod());

这个类实现了,

public class AsteriskPasswordTransformationMethod extends PasswordTransformationMethod {
    @Override
    public CharSequence getTransformation(CharSequence source, View view) {
        return new PasswordCharSequence(source);
    }
 
    private class PasswordCharSequence implements CharSequence {
        private CharSequence mSource;
        public PasswordCharSequence(CharSequence source) {
            mSource = source; // Store char sequence
        }
        public char charAt(int index) {
            return '*'; // This is the important part
        }
        public int length() {
            return mSource.length(); // Return default
        }
        public CharSequence subSequence(int start, int end) {
            return mSource.subSequence(start, end); // Return default
        }
    }
};

如果您的代码是 Kotlin,那么您必须制作单独的 java 文件,然后您必须将 java 与 kotlin 代码一起使用。

【讨论】:

  • 谢谢,这对我有用。我的情况是,我必须隐藏最后 10 个数字,而不是全部。所以,我只需要重写方法 charAt(int index) 以返回 '*' if index > 9 else return mSource.charAt(index)。
  • 不错的工作伙伴!你知道什么是默认字符吗?在我的情况下,我必须显示前 3 个字符,而不仅仅是默认密码屏蔽字符,而不是 '*'。
  • 这消除了实际文本首先显示在“密码”字符之前的间隔。知道如何保留它吗?
  • 有没有人尝试在 charAt() 方法中输入日志,我看到它被调用了数千次。
【解决方案2】:

科特林

class AsteriskPasswordTransformationMethod : PasswordTransformationMethod() {

    override fun getTransformation(source: CharSequence, view: View): CharSequence {
        return PasswordCharSequence(source)
    }

    inner class PasswordCharSequence (private val source: CharSequence) : CharSequence {

        override val length: Int
            get() = source.length

        override fun get(index: Int): Char = '*'

        override fun subSequence(startIndex: Int, endIndex: Int): CharSequence {
            return source.subSequence(startIndex, endIndex)
        }
        
    }
    
}

【讨论】:

    【解决方案3】:

    以 Kotlin 方式:

    class AsteriskPasswordTransformationMethod: PasswordTransformationMethod() {

    override fun getTransformation(source: CharSequence?, view: View?): CharSequence {
        return super.getTransformation(source, view)
    }
    
    
     abstract inner class PasswordCharSequence(val source: CharSequence) : CharSequence {
         override val length: Int
             get() = source.length
    
         override fun get(index: Int): Char =
             '*'
    
        override fun subSequence(start: Int, end: Int): CharSequence {
            return source.subSequence(start, end) // Return default
        }
    }
    

    }`

    【讨论】:

      【解决方案4】:
      <EditText
              android:id="@+id/passWord1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:gravity="center"
              android:inputType="textPassword"//here is the change. check it once in your xml
              android:password="true"/>
      

      在eclipse中,当你将光标移动到android:inputType时,点击Ctrl + Space会有提示。然后你可以看到选项列表。在那里你可以选择textPassword

      如果您想查看* 代替.,请查看此Android: Asterisk Password Field

      【讨论】:

      • 我认为 android:password="true" 也是如此。密码应该是 number 。所以我给 android:inputType="number"
      【解决方案5】:
      EditText.setTransformationMethod(new PasswordTransformationMethod());
      

      【讨论】:

        【解决方案6】:

        借助 Ram kiran 发布的链接得到答案

        text.setTransformationMethod(new AsteriskPasswordTransformationMethod());
        
        
        public class AsteriskPasswordTransformationMethod extends PasswordTransformationMethod {
        @Override
        public CharSequence getTransformation(CharSequence source, View view) {
            return new PasswordCharSequence(source);
        }
        
        private class PasswordCharSequence implements CharSequence {
            private CharSequence mSource;
            public PasswordCharSequence(CharSequence source) {
                mSource = source; // Store char sequence
            }
            public char charAt(int index) {
                return '*'; // This is the important part
            }
            public int length() {
                return mSource.length(); // Return default
            }
            public CharSequence subSequence(int start, int end) {
                return mSource.subSequence(start, end); // Return default
            }
        }
        };
        

        【讨论】:

        • 谢谢,这正是我所需要的!如果我想让它显示字符,然后在用户输入另一个字符后对其进行星号化,我会在 textwatcher 界面旁边使用此方法吗?
        • 但它不适用于 app:passwordToggleDrawable
        【解决方案7】:

        试试这个

        android:inputType="textPassword"       
        

        【讨论】:

        • 我推荐这个答案。 password 属性已弃用。
        【解决方案8】:

        对于android:inputType,有一种密码。

        【讨论】:

          猜你喜欢
          • 2012-01-01
          • 2016-12-19
          • 2018-10-05
          • 2018-03-09
          • 1970-01-01
          • 1970-01-01
          • 2021-12-09
          • 2011-12-03
          • 2013-08-29
          相关资源
          最近更新 更多