web-dev-qa-db-ja.com

ポップアップで入力エラーを表示する方法は?

下の画像に示すように、ポップアップにEdiTextフィールドのすべての検証エラーを表示したい:

Error alert in popup

私の知る限りAndroidにはドロアブルがあります:

1)popup_inline_error.9.png

popup_inline_error.9.png

2)popup_inline_error_above.9.png

popup_inline_error_above.9

3)indicator_input_error.png

indicator_input_error.png

次を使用して、EditTextの右側に赤いエラーインジケーターを表示できます。

Drawable err_indiactor = getResources().getDrawable(R.drawable.indicator_input_error);
mEdiText.setCompoundDrawablesWithIntrinsicBounds(null, null, err_indiactor, null);

また、最初の画像に示されているようにエラーメッセージを表示したいのですが、カスタムトーストにする必要があると思いますが、これについては何もわからないようです。

61
Vikas Patidar

これを試して..

final EditText editText=(EditText) findViewById(R.id.edit);

 editText.setImeActionLabel("",EditorInfo.IME_ACTION_NEXT);

        editText.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if(actionId==EditorInfo.IME_ACTION_NEXT){
                    if( editText.getText().toString().trim().equalsIgnoreCase(""))
                        editText.setError("Please enter some thing!!!");
                    else
                        Toast.makeText(getApplicationContext(),"Notnull",Toast.LENGTH_SHORT).show();
                }
                return false;
            }
        });
34
SBK

以前の答えは私の問題の解決策ですが、デフォルトの_indicator_input_error_画像の代わりにカスタムDrawable画像を使用する別のアプローチを試みました。

デフォルトのドロアブル

Default Drawable

カスタムドローアブル

Custom Drawable

したがって、レイアウトxmlファイルに2つのEditTextを作成し、そのListenerにJavaコードでEditTextを実装しました。

main.xml

_<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical" Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" Android:padding="20dip"
    Android:background="#222222">
    <EditText Android:layout_width="match_parent"
        Android:layout_height="wrap_content" Android:hint="Username"
        Android:id="@+id/etUsername" Android:singleLine="true"
        Android:imeActionLabel="Next"></EditText>
    <EditText Android:layout_width="match_parent"
        Android:inputType="textPassword"
        Android:layout_height="wrap_content" Android:hint="Password"
        Android:id="@+id/etPassword" Android:singleLine="true"
        Android:imeActionLabel="Next"></EditText>
</LinearLayout>
_

EditTextValidator.Java

_import Java.util.regex.Pattern;

import Android.app.Activity;
import Android.graphics.Rect;
import Android.graphics.drawable.Drawable;
import Android.os.Bundle;
import Android.text.Editable;
import Android.text.TextWatcher;
import Android.view.KeyEvent;
import Android.view.inputmethod.EditorInfo;
import Android.widget.EditText;
import Android.widget.TextView;
import Android.widget.TextView.OnEditorActionListener;

public class EditTextValidator extends Activity {

    private EditText mUsername, mPassword;

    private Drawable error_indicator;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Setting custom drawable instead of red error indicator,
        error_indicator = getResources().getDrawable(R.drawable.Emo_im_yelling);

        int left = 0;
        int top = 0;

        int right = error_indicator.getIntrinsicHeight();
        int bottom = error_indicator.getIntrinsicWidth();

        error_indicator.setBounds(new Rect(left, top, right, bottom));

        mUsername = (EditText) findViewById(R.id.etUsername);
        mPassword = (EditText) findViewById(R.id.etPassword);

        // Called when user type in EditText
        mUsername.addTextChangedListener(new InputValidator(mUsername));
        mPassword.addTextChangedListener(new InputValidator(mPassword));

        // Called when an action is performed on the EditText
        mUsername.setOnEditorActionListener(new EmptyTextListener(mUsername));
        mPassword.setOnEditorActionListener(new EmptyTextListener(mPassword));
    }

    private class InputValidator implements TextWatcher {
        private EditText et;

        private InputValidator(EditText editText) {
            this.et = editText;
        }

        @Override
        public void afterTextChanged(Editable s) {

        }

        @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.length() != 0) {
                switch (et.getId()) {
                case R.id.etUsername: {
                    if (!Pattern.matches("^[a-z]{1,16}$", s)) {
                        et.setError("Oops! Username must have only a-z");
                    }
                }
                    break;

                case R.id.etPassword: {
                    if (!Pattern.matches("^[a-zA-Z]{1,16}$", s)) {
                        et.setError("Oops! Password must have only a-z and A-Z");
                    }
                }
                    break;
                }
            }
        }
    }

    private class EmptyTextListener implements OnEditorActionListener {
        private EditText et;

        public EmptyTextListener(EditText editText) {
            this.et = editText;
        }

        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

            if (actionId == EditorInfo.IME_ACTION_NEXT) {
                // Called when user press Next button on the soft keyboard

                if (et.getText().toString().equals(""))
                    et.setError("Oops! empty.", error_indicator);
            }
            return false;
        }
    }
}
_

今、私はそれを次のようにテストしました:

空のEditText検証の場合:

ユーザーがUsernameフィールドをクリックしてからSoftkeybordが開き、ユーザーがNextキーを押すと、ユーザーはPasswordフィールドにフォーカスされ、Usernameフィールドが残るとします空の場合、以下の画像のようにエラーが表示されます。

Empty textEmpty text

間違った入力検証の場合:

1)ユーザー名フィールドにvikaSというテキストを入力すると、エラーは次の画像のようになります。

Wrong username

2)パスワードフィールドに_Password1_というテキストを入力すると、エラーは次の画像のようになります:

wrong password

注意:

ここでは、ユーザーがEditTextフィールドを空白にしてキーボードの[次へ]キーを押した場合にのみカスタムDrawableを使用しましたが、どのような場合でも使用できます。 setError()メソッドでDrawableオブジェクトを提供する必要があるのはあなただけです。

38
Vikas Patidar

回答者が回答を受け入れたことは知っていますが、上記のどれも役に立たなかった。

Android 4.0.3。を実行しているNexus Sでこれを再現できました。

これが私がそれを機能させた方法です。

  1. 次を使用してテーマを作成します。

    <style name="MyApp.Theme.Light.NoTitleBar" parent="@Android:style/Theme.Light.NoTitleBar">
         <item name="Android:textColorPrimaryInverse">@Android:color/primary_text_light
         </item>
    </style>
    
  2. 適用MyApp.Theme.Light.NoTitleBarマニフェストからアプリケーション/アクティビティへのテーマ。

        <application
             Android:name=".MyApp"
             Android:icon="@drawable/ic_launcher"
             Android:label="@string/app_name" 
             Android:theme="@style/MyApp.Theme.Light.NoTitleBar"
        >
    
1
Shardul