【问题标题】:Edittext input type password, not hiding text after clear focus androidEdittext输入类型密码,清除焦点android后不隐藏文本
【发布时间】:2018-02-24 05:16:33
【问题描述】:

我正在使用视图输入用户的四位 PIN。 UI 由 4 个编辑文本组成,每个编辑文本的 maxLength 设置为 1。在输入值以编辑文本 1 时,焦点然后转移到第二个编辑文本,依此类推。每个 Edittext 输入类型是:numberPassword。

<EditText
            android:id="@+id/ed_1"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:gravity="center"
            android:inputType="numberPassword"
            android:maxLength="1" />

在java中,为了转移焦点,我们对每个edittext应用了以下文本观察器:

ed1.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.toString().length() == 1) {
                ed1.clearFocus();
                ed2.requestFocus();
                ed2.setCursorVisible(true);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

问题是edittext的值没有变成*,它显示的是真实的输入数字(没有变成密码)。只有第一个和最后一个更改为 *,其中中心 2 表示 edittext 2 和 edittext 3 仍然有可见密码。

现在:我们有 4 个输入编辑文本

期望的输出应该是:| * | * | * | * |

当我们填充值并切换焦点时,通过使用指定的java代码,它们会变为:(输入值:1234):| * | 2 | 3 | * |

如果我们重新关注任何一个中心编辑文本,那么值就会更改为密码。是不是因为去掉了焦点,而将字段更改为密码所需的转换时间需要更多时间?有什么方法可以强制将值更改为密码。

【问题讨论】:

  • 因为您没有为这两个编辑文本使用此属性。设置此属性 android:inputType="textPassword" 并完成先生
  • 我希望它会如此简单。每个编辑文本都是问题中指定的精确复制。每个都有 android:inputType="numberPassword"
  • 尝试将代码放在 Runnable 中,然后发布,有帮助吗?
  • 您可以使用 Handler 进行延迟,以便它会更改文本。 Check my answer below
  • 您找到合适的解决方案了吗?我也面临同样的问题。

标签: android android-edittext


【解决方案1】:

只需将您的代码从 onTextChanged 移动到 afterTextChanged,您不需要 clearFocus,只需 requestFocus。

这样你在改变焦点之前有时间混淆数字。

【讨论】:

    【解决方案2】:

    尝试在转换后为之前的文本运行以下代码

    yourEditText.setTransformationMethod(new PasswordTransformationMethod());
    

    这是一个困难的方法,但是

    String e1,e2,e3,e4; 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    if (s.toString().length() == 1 && !ed1.getText().toString().equals("*")) { 
    e1=ed1.getText(); 
    ed1.setText("*"); 
    ed2.requestFocus(); 
    ed2.setCursorVisible(true); } }
    

    你可以用这个方法

    【讨论】:

    • ed1.setText("*");在 onTextChanged 中将再次调用 onTextChanged 条件为真,并将进入无限循环..因此导致 ANR。
    • 更新!您可以通过添加控件来防止无限循环
    • 是的,它有效!谢谢。但是您认为造成这个问题的原因是什么?
    • 我不知道,时间可能是个问题,但为什么只有 2 和 3,我不知道。
    • 密码只包含数字,你删除是对的 对于这个if(ed1.getText()!=null) ed1.setText("*");您需要添加。
    【解决方案3】:

    似乎 TextWatcher 需要一些时间来将其更改为密码类型, 所以我使用 Handler 提出了这个解决方案,它工作正常。试试下面的代码

    ed1.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.toString().length() == 1) {
    
                // use Handler for 1 second delay so that it will change text
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        ed2.requestFocus();
                    }
                },1000);
    
            }
        }
    
        @Override
        public void afterTextChanged(Editable s) {
    
        }
    });
    

    【讨论】:

    • 你遇到了什么错误?它在我的机器上运行良好。
    【解决方案4】:

    只需从您的代码中删除 ed1.clearFocus();。不要强迫edittext失去焦点,只需告诉其他edittext重新获得焦点ed2.requestFocus();。一旦下一个edittext获得焦点,前一个edittext就会自动删除其焦点。它将首先转换值,然后离开其焦点。

    【讨论】:

      【解决方案5】:

      因为您将 maxLength 设置为 1,所以它只会获得单个字符。您还在 onTextChanged 中为 clearFocus 编写了代码,因此它将焦点设置到下一个 EditText。您必须在 xml 中进行如下更改。

      <EditText
        android:id="@+id/ed_1"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:gravity="center"
        android:inputType="numberPassword"
        android:maxLength="4" />
      

      同时删除 onTextChanged() 中的 clearFocus。

      【讨论】:

      • 使用最大长度为4的单个edittext无法实现UI。我们需要4个edittext,每个最大长度为1。并且在填充一个之后应该将焦点切换到下一个edittext。
      猜你喜欢
      • 2016-04-18
      • 2011-12-06
      • 2013-07-03
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多