175

一連のEditTextでフォーム入力の検証を行う必要があります。OnFocusChangeListenersを使用して、ユーザーがそれぞれに入力した後に検証をトリガーしていますが、これは最後のEditTextで期待どおりに動作しません。

最後のEditTextを入力しているときに[完了]ボタンをクリックすると、InputMethodが切断されますが、技術的にはEditTextへのフォーカスが失われることはありません(したがって、検証は行われません)。

最善の解決策は何ですか?

フォーカスが変更されたときではなく、InputMethodが各EditTextからバインド解除されたときに監視する必要がありますか?もしそうなら、どのように?

4

14 に答える 14

157

使ってみませんTextWatcherか?

検証するボックスがいくつかあるのでEditText、次のことが適していると思います。

  1. あなたの活動はandroid.text.TextWatcherインターフェースを実装します
  2. TextChangedリスナーをEditTextボックスに追加します
txt1.addTextChangedListener(this);
txt2.addTextChangedListener(this);
txt3.addTextChangedListener(this);
  1. afterTextChanged(Editable s)オーバーライドされたメソッドのうち、次のようにメソッドを使用できます
@Override
public void afterTextChanged(Editable s) {
    // validation code goes here
}

Editable s、どのEditTextボックスのテキストが変更されているかを見つけるのに実際には役立ちません。ただし、次のようなEditTextボックスの内容を直接確認できます。

String txt1String = txt1.getText().toString();
// Validate txt1String

同じ方法で。私は明確であることを願っています、そして私がそうであるならば、それは助けになります!:)

編集:よりクリーンなアプローチについては、以下のクリストファーペリーの回答を参照してください。

于 2010-05-18T09:28:24.293 に答える
134

TextWatcherは私の好みでは少し冗長なので、飲み込みやすいものを作成しました。

public abstract class TextValidator implements TextWatcher {
    private final TextView textView;

    public TextValidator(TextView textView) {
        this.textView = textView;
    }

    public abstract void validate(TextView textView, String text);

    @Override
    final public void afterTextChanged(Editable s) {
        String text = textView.getText().toString();
        validate(textView, text);
    }

    @Override
    final public void beforeTextChanged(CharSequence s, int start, int count, int after) { /* Don't care */ }

    @Override
    final public void onTextChanged(CharSequence s, int start, int before, int count) { /* Don't care */ }
}

次のように使用してください。

editText.addTextChangedListener(new TextValidator(editText) {
    @Override public void validate(TextView textView, String text) {
       /* Validation code here */
    }
});
于 2012-08-07T03:10:57.193 に答える
97

エラーが発生したときに適切な検証ポップアップと画像が必要な場合は、ここで説明するクラスのsetErrorメソッドを使用できますEditText

リンクされた投稿の作成者であるDonnFelkerから取得したsetErrorの使用のスクリーンショット

于 2011-11-23T20:59:11.423 に答える
27

検証ロジックの冗長性を減らすために、Android用のライブラリを作成しました。アノテーションと組み込みルールを使用して、日常の検証のほとんどを処理します。、、、、、、、など@TextRuleの制約@NumberRuleがあります。@Required@Regex@Email@IpAddress@Password

これらのアノテーションをUIウィジェット参照に追加して、検証を実行できます。また、非同期で検証を実行できるため、リモートサーバーから一意のユーザー名を確認するなどの状況に最適です。

プロジェクトのホームページには、注釈の使用方法に関する例があります。検証用のカスタムルールの作成方法に関するサンプルコードを書いた関連ブログ投稿も読むことができます。

これは、ライブラリの使用法を示す簡単な例です。

@Required(order = 1)
@Email(order = 2)
private EditText emailEditText;

@Password(order = 3)
@TextRule(order = 4, minLength = 6, message = "Enter at least 6 characters.")
private EditText passwordEditText;

@ConfirmPassword(order = 5)
private EditText confirmPasswordEditText;

@Checked(order = 6, message = "You must agree to the terms.")
private CheckBox iAgreeCheckBox;

Ruleライブラリは拡張可能であり、クラスを拡張することで独自のルールを作成できます。

于 2012-10-23T14:06:07.373 に答える
12

更新されたアプローチ-TextInputLayout:

Googleは最近デザインサポートライブラリを立ち上げました。TextInputLayoutと呼ばれるコンポーネントが1つあり、とを介しsetErrorEnabled(boolean)てエラーを表示することをサポートしていますsetError(CharSequence)

それの使い方?

ステップ1:EditTextをTextInputLayoutでラップします。

  <android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/layoutUserName">

    <EditText
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:hint="hint"
      android:id="@+id/editText1" />

  </android.support.design.widget.TextInputLayout>

ステップ2:入力を検証する

// validating input on a button click
public void btnValidateInputClick(View view) {

    final TextInputLayout layoutUserName = (TextInputLayout) findViewById(R.id.layoutUserName);
    String strUsername = layoutLastName.getEditText().getText().toString();

    if(!TextUtils.isEmpty(strLastName)) {
        Snackbar.make(view, strUsername, Snackbar.LENGTH_SHORT).show();
        layoutUserName.setErrorEnabled(false);
    } else {
        layoutUserName.setError("Input required");
        layoutUserName.setErrorEnabled(true);
    }
}

Githubリポジトリに例を作成しました。必要に応じて、例を確認してください。

于 2015-07-25T10:16:24.463 に答える
11

これはここからの素晴らしい解決策でした

InputFilter filter= new InputFilter() { 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
        for (int i = start; i < end; i++) { 
            String checkMe = String.valueOf(source.charAt(i));

            Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*");
            Matcher matcher = pattern.matcher(checkMe);
            boolean valid = matcher.matches();
            if(!valid){
                Log.d("", "invalid");
                return "";
            }
        } 
        return null; 
    } 
};

edit.setFilters(new InputFilter[]{filter}); 
于 2012-08-14T08:16:16.027 に答える
8

いくつかの検証メソッドをネイティブにサポートし、実際には非常に柔軟なEditTextを拡張するクラスを作成しました。

私が書いているように、現在、 xml属性の検証メソッドを通じてネイティブにサポートされているのは次のとおりです。

  1. アルファ
  2. 英数字
  3. 数値
  4. ジェネリック正規表現
  5. 文字列の空

こちらでチェックできます

楽しんでくれると良いです :)

于 2012-05-24T21:44:22.620 に答える
7

アンドロイドでのテキスト入力を検証するには、InputFilterの方が適切だと思います。

簡単な例を次に示します 。AndroidでEditTextの文字を制限するためにInputFilterを使用するにはどうすればよいですか?

トーストを追加して、制限についてユーザーにフィードバックすることができます。android:inputTypeタグもチェックしてください。

于 2011-10-05T08:49:34.217 に答える
6

ある場合には値が符号なし浮動小数点値であり、別の場合には符号付き浮動小数点値であることをテストするために、フィールド間検証ではなくフィールド内検証を行う必要がありました。これが私にとってうまくいくようです:

    <EditText
        android:id="@+id/x" 
        android:background="@android:drawable/editbox_background" 
        android:gravity="right" 
        android:inputType="numberSigned|numberDecimal" 
    />

「numberSigned|numberDecimal」内にスペースを入れないでください。例:「numberSigned|numberDecimal」は機能しません。理由はわかりません。

于 2011-01-01T23:50:09.367 に答える
5

これは本当に有望に見え、ドキュメントが私に注文したものです:

EditTextバリデーター

    public void onClickNext(View v) {
    FormEditText[] allFields    = { etFirstname, etLastname, etAddress, etZipcode, etCity };
    
    
    boolean allValid = true;
    for (FormEditText field: allFields) {
        allValid = field.testValidity() && allValid;
    }
    
    if (allValid) {
        // YAY
    } else {
        // EditText are going to appear with an exclamation mark and an explicative message.
    }
}

カスタムバリデーターとこれらの組み込み:

  • 正規表現:カスタム正規表現用
  • 数値:唯一の数値フィールドの場合
  • alpha:アルファのみのフィールドの場合
  • alphaNumeric:何だと思いますか?
  • personName:入力されたテキストが人の名前か姓かを確認します。
  • personFullName:入力された値が完全なフルネームであるかどうかを確認します。
  • メール:フィールドが有効なメールであることを確認します
  • creditCard : Luhnアルゴリズムを使用して、フィールドに有効なクレジットカードが含まれていることを確認します
  • 電話:フィールドに有効な電話番号が含まれていることを確認します
  • domainName:フィールドに有効なドメイン名が含まれていることを確認します(常にAPIレベル<8のテストに合格します)
  • ipAddress:フィールドに有効なIPアドレスが含まれていることを確認します
  • webUrl:フィールドに有効なURLが含まれていることを確認します(常にAPIレベル<8のテストに合格します)
  • date:フィールドが有効な日付/日時形式であることを確認します(customFormatが設定されている場合は、customFormatで確認します)
  • nocheck:フィールドの空以外はチェックしません。
于 2013-12-18T07:36:39.510 に答える
2

ユーザーがキーボードの[完了]ボタンを押したときに聞くことで、望ましい動作を得ることができます。また、私の投稿「Androidフォームの検証-正しい方法」でEditTextの操作に関するその他のヒントを確認してください。

サンプルコード:

mTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {                    
            validateAndSubmit();
            return true;
        }
        return false;
    }});  
于 2013-08-04T21:33:57.637 に答える
2

main.xmlファイル内

次の属性を配置して、編集テキストで受け入れることができるアルファベット文字のみを検証できます。

これを行う :

  android:entries="abcdefghijklmnopqrstuvwxyz"
于 2014-04-07T04:53:46.263 に答える
0

メールとパスワードの検証については、

  if (isValidEmail(et_regemail.getText().toString())&&etpass1.getText().toString().length()>7){
      if (validatePassword(etpass1.getText().toString())) {
      Toast.makeText(getApplicationContext(),"Go Ahead".....
      }
      else{

       Toast.makeText(getApplicationContext(),"InvalidPassword".....
       }

}else{

 Toast.makeText(getApplicationContext(),"Invalid Email".....
}


public boolean validatePassword(final String password){
    Pattern pattern;
    Matcher matcher;
    final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[A-Z])(?=.* 
    [@#$%^&+=!])(?=\\S+$).{4,}$";
    pattern = Pattern.compile(PASSWORD_PATTERN);
    matcher = pattern.matcher(password);

    return matcher.matches();
}

public final static boolean isValidEmail(CharSequence target) {
    if (target == null)
        return false;

    return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
于 2018-05-10T07:04:58.873 に答える
-2

私はAndroid用にこのライブラリを作成しました。このライブラリでは、マテリアルデザインのEditTextを内部で検証し、EditTextLayoutを次のように簡単に検証できます。

    compile 'com.github.TeleClinic:SmartEditText:0.1.0'

次に、次のように使用できます。

<com.teleclinic.kabdo.smartmaterialedittext.CustomViews.SmartEditText
    android:id="@+id/passwordSmartEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:setLabel="Password"
    app:setMandatoryErrorMsg="Mandatory field"
    app:setPasswordField="true"
    app:setRegexErrorMsg="Weak password"
    app:setRegexType="MEDIUM_PASSWORD_VALIDATION" />

<com.teleclinic.kabdo.smartmaterialedittext.CustomViews.SmartEditText
    android:id="@+id/ageSmartEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:setLabel="Age"
    app:setMandatoryErrorMsg="Mandatory field"
    app:setRegexErrorMsg="Is that really your age :D?"
    app:setRegexString=".*\\d.*" />

次に、次のように有効かどうかを確認できます。

    ageSmartEditText.check()

その他の例とカスタマイズについては、リポジトリ https://github.com/TeleClinic/SmartEditTextを確認してください

于 2017-12-22T09:09:59.530 に答える