【问题标题】:Edit text first time to input a letter validation首次编辑文本以输入字母验证
【发布时间】:2015-06-19 13:18:56
【问题描述】:

我正在创建一个应用程序来检查用户是否输入了字母或数字,然后会弹出一个按钮。如果用户没有输入单个字母,则会显示验证。

这是我正在尝试调试的示例[主要活动。 PS。不是我的真实代码]:

private EditText edittext;

    Button checkBtn;

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

        addKeyListener();
    }

    public void addKeyListener() {
        edittext = (EditText) findViewById(R.id.editText);
        checkBtn = (Button) findViewById(R.id.button1);

        checkBtn.setVisibility(View.INVISIBLE);


        edittext.setOnKeyListener(new OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {


                if ((event.getAction() == KeyEvent.ACTION_DOWN)
                        && (keyCode == KeyEvent.KEYCODE_ENTER)) {

                    checkBtn.setVisibility(View.VISIBLE);

                    return true;

                else if ((event.getAction() == KeyEvent.ACTION_DOWN)
                    && (keyCode == KeyEvent.KEYCODE_9)) {

                // display a floating message
                Toast.makeText(MyAndroidAppActivity.this,
                        "Number 9 is pressed!", Toast.LENGTH_LONG).show();
                return true;
            }

            return false;
}
        });

    }
}

问题: 有没有办法让按钮在用户键入字母而不单击回车键时自动显示。如果用户没有输入字母,则会弹出验证提示无效并且按钮不会显示。

我试图寻找正确的答案,但还是找不到。

【问题讨论】:

  • 只需添加 Jacob Holloway 提到的 textWatcher

标签: android validation button android-edittext


【解决方案1】:

你,我的朋友,需要一个

EditText editText = (EditText)findViewById(R.id.edittext);
editText .addTextChangedListener(new TextWatcher() {

        @Override
        public void afterTextChanged(Editable s) {
            ; //Do nothing
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            ; //Do nothing
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //TODO put your code here.
        } 

    });

现在,只需检查“s”字符序列是否包含您的字母,您就可以上路了。


编辑: 获得 CharSequence 后,只需检查第一个字符是否为字母。

要获取第一个字符,请执行

s.charAt(0);  //Note: if there is nothing here, it could throw a null pointer.

Character 类有一个静态函数,你可以使用它来查看它是不是一个字母(或数字、大写、小写、数字、数字或字母等)调用

Character.isLetter(char); 

所以你可以做类似的事情

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //Check to see that there is at least 1 char to look at.
            //Then check to see if it is a letter.
            //(Note: the && is AND, so both things have to be true)
            if (s.length() > 0 && Character.isLetter(s.charAt(0))) {
                ; //Display your button
            } else { 
                ; //Display your error
            }
        }

这有帮助吗?


您可以创建一个名为 MyTextWatcher 的新类(在它自己的文件中,您可以将其导入到任何地方或作为类中的类(如果所有编辑文本都在同一区域中)),然后在里面做您现在擅长的常规内容:

public class MyTextWatcher implements 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) {
    }
    @Override
    public void afterTextChanged(Editable s) {  
    }
}

我个人更喜欢在包含编辑文本的类中执行此操作,但它可以放在一个单独的文件中(您可以导入),这样它就更易于重用。如果出于任何原因,您需要使用 TextWatcher 访问内容,您可以将它们作为构造函数传入。在类中做事的好处是你不必将东西传递给构造函数。你要做的只是更少的事情。但这里是那个构造函数的一个例子......

public class MyTextWatcher implements TextWatcher {
    private Thing1 mThing1;
    private Thing2 mThing2;
    public MyTextWatcher(Thing1 t1, Thing2 t2) {
        mThing1 = t1;
        mThing2 = t2;
    }
    ...
}

注意:这样做时请注意不要将事物链接太多。以后可能会长毛。 :)

【讨论】:

  • 对不起,你能帮帮我吗?我只是 android 编码的新手。谢谢
  • 最后一个问题是他们构建一个可以处理 6 个编辑文本并在私有类声明中调用它的代码的方法。谢谢
  • 在您的问题底部又添加了一个部分。希望它足够清楚。
【解决方案2】:

试试这个我不确定这是否是您期望的确切解决方案。

        button = (Button) findViewById(R.id.button1);
    button.setVisibility(View.GONE);

    editText.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(editText.getText().length() > 0 && !s.toString().equals("\n")){
                button.setVisibility(View.VISIBLE);
            }
            else{
                button.setVisibility(View.GONE);
                Toast.makeText(MainActivity.this, "Invalid", Toast.LENGTH_SHORT).show();
            }

       }

        @Override
        public void afterTextChanged(Editable s) {
        }
    }); 

【讨论】:

    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多