2

Androidでは、4つの単一の数字フィールドを持つパスワードの要件があり、4つのedittextビューを使用しました. 4 つの数字を入力すると、4 つのフィールドが自動的に入力されます。addTextChangedListener を使用してこれを行いました。しかし、問題を除いて、私のパスワードフィールドはドットに置き換えられません。requestfocus() を次のフィールドに使用しているため、前のフィールドがドットを変換していないと思います。私を助けてください。

  passInput1.addTextChangedListener(new CustomTextWatcher(passInput1, passInput2));
  passInput2.addTextChangedListener(new CustomTextWatcher(passInput2, passInput3));
  passInput3.addTextChangedListener(new CustomTextWatcher(passInput3, passInput4));

My CustomWatcher を以下に示します。

public class CustomTextWatcher implements TextWatcher {
      private EditText currentEditTextFiledId;
      private EditText nextEditTextFiledId;

         public CustomTextWatcher(EditText currentEditTextFiledId, EditText  nextEditTextFiledId) { 
        this.currentEditTextFiledId = currentEditTextFiledId;
        this.nextEditTextFiledId = nextEditTextFiledId;
    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         currentEditTextFiledId.setTransformationMethod(PasswordTransformationMethod.getInstance());
    }

    public void onTextChanged(CharSequence s, int start, int before, int count) {
         Integer textlength1 = currentEditTextFiledId.getText().length();


         if (textlength1 >= 1) { 

             nextEditTextFiledId.requestFocus();

         }
    }

    public void afterTextChanged(Editable s) {

    }
}
4

3 に答える 3

1

フォーカスを次のフィールドに移動する前に、最初にマスクする必要があるフィールドにフォーカスを移動するだけで、これを回避する興味深い方法を見つけました。

pinBox1.addTextChangedListener(new CustomTextWatcher(pinBox1, pinBox2, pinBox2));
pinBox2.addTextChangedListener(new CustomTextWatcher(pinBox2, pinBox3, pinBox1));
pinBox3.addTextChangedListener(new CustomTextWatcher(pinBox3, pinBox4, pinBox2));
pinBox4.addTextChangedListener(new CustomTextWatcher(pinBox4, pinBox4, pinBox3));

そのため、フィールドを変更するために別のパラメーターを渡し、最初にそこにフォーカスをリクエストするだけです。

public class CustomTextWatcher implements TextWatcher {
    private EditText currentEditTextFieldId;
    private EditText nextEditTextFieldId;
    private EditText editTextFieldToChange;

    public CustomTextWatcher(EditText currentEditTextFieldId, EditText  nextEditTextFieldId, EditText editTextFieldToChange) { 
        this.currentEditTextFieldId = currentEditTextFieldId;
        this.nextEditTextFieldId = nextEditTextFieldId;
        this.editTextFieldToChange = editTextFieldToChange;
    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        currentEditTextFieldId.setTransformationMethod(PasswordTransformationMethod.getInstance());
    }

    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Integer textlength1 = currentEditTextFieldId.getText().length();


        if (textlength1 >= 1) { 
            editTextFieldToChange.requestFocus();
            nextEditTextFieldId.requestFocus();
        }
    }

    public void afterTextChanged(Editable s) {

    }
}
于 2013-05-14T15:39:58.610 に答える
0

Runnable を現在の EditText に投稿します。入力したテキストをドットに変換するまで現在の EditText を待機させてから、requestFocus() を呼び出す必要があります。

currentEditTextFiledId.post(new Runnable(){
     Integer textlength1 = currentEditTextFiledId.getText().length();
     if (textlength1 >= 1) { 
         nextEditTextFiledId.requestFocus();
     }
});
于 2014-04-12T12:16:24.963 に答える
0

パスワード モードでも、Android は常に最後に入力された記号を表示します (ボタンが小さく、押し間違えやすいため)。一般に、4 つの数値フィールドは悪い考えのように思えます。ユーザーがバックスペース キーを押すとどうなりますか?

http://developer.android.com/reference/android/widget/TextView.html#attr_android:inputTypeで単一のパスワードフィールドを使用しますandroid:inputType="number"

本当に車輪を再発明したい場合は、4 つの読み取り専用テキスト フィールドと、数字を入力するための 10 個の大きなボタンを使用できます。少なくとも、それらの動作を制御できます。

于 2013-02-07T06:34:44.897 に答える