首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在弹出窗口中显示输入错误?

如何在弹出窗口中显示输入错误?
EN

Stack Overflow用户
提问于 2011-03-07 18:46:26
回答 3查看 37.9K关注 0票数 61

我希望在弹出窗口中显示EdiText字段的所有验证错误,如下图所示:

据我所知,Android有可绘制的:

1) popup_inline_error.9.png

2) popup_inline_error_above.9.png

3) indicator_input_error.png

我可以使用以下命令在EditText的右侧显示红色错误指示器:

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

现在,我还想显示错误消息,如第一张图像所示,但我似乎对此一无所知,尽管我认为它应该是一个自定义吐司。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-07 20:38:57

试试这个..。

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
EN

Stack Overflow用户

发布于 2011-03-08 21:08:33

因为前面的答案是我的问题的解决方案,但我尝试了一种不同的方法来使用自定义的可绘制图像,而不是默认的indicator_input_error图像。

默认可绘制

自定义可绘制

因此,我刚刚在布局xml文件中创建了两个EditText,然后在EditText上用Java语言实现了一些Listener

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字段,然后软键打开,如果用户按下Next键,则用户将专注于Password字段,而Username字段保持为空,则错误将显示为如下图所示:

错误输入验证的

1)我在用户名字段中输入文本vikaS,然后会出现如下图所示的错误:

2)我在password字段中输入文本Password1,然后错误将如下图所示:

注意:

在这里,我只在用户将EditText字段留空并在键盘上按下Next键的情况下使用自定义可绘制,但您可以在任何情况下使用它。只需要在setError()方法中提供Drawable对象即可。

票数 38
EN

Stack Overflow用户

发布于 2012-02-26 02:33:32

我知道答案已经被提问者接受了,但上面的答案对我都不起作用。

我能够在我的运行Android 4.0.3的Nexus S上重现这段视频。

这就是我是如何工作的。

  1. 使用以下命令创建主题:
  2. 通过清单将MyApp.Theme.Light.NoTitleBar主题应用于我的应用程序/活动。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5218691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档