Algorithm_String: 字符串与EditText_02

关于EditText的小技巧,在这几篇博客中均有提到,总结如下:

UI效果(6): EditText与软键盘

FAQ_10_EditText与parseInt方法

Algorithm_String: 字符串与EditText_01


这篇博客在 Algorithm_String: 字符串与EditText_01 基础之上,增加的知识点如下:

1.  为EditText设置TextChangedListener事件

2.  在TextChangedListener事件中,删除指定字符,即禁止用户输入指定的字符

3.  EditText与TextUtils类的方法

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

源码如下:

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class EditTextAndString extends Activity {
private static final char SPACE = 0x20;


private EditText user = null;
private EditText result = null;
private Button button = null;


private final TextWatcher mTextWatcher = 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) {
}


@Override
public void afterTextChanged(Editable s) {
Log.d("mark", "afterTextChanged()");
// 如果输入#,EditText不接受其输入,可以改为其它非法字符
// deleteChar(s, '#');
deleteChar(s, new char[] { '@', '$', '%' });
}
};


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


user = (EditText) findViewById(R.id.user);
result = (EditText) findViewById(R.id.result);
button = (Button) findViewById(R.id.button);
// 注册TextChangedListener
user.addTextChangedListener(mTextWatcher);


button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String name = user.getText().toString();


String res = removeAllSpace(name);
result.append("去除所有空格后:" + res + "\n");


if (isChinese(name)) {
// ToDo
}
}
});
}


/**
* 删除指定字符

* @param s
* @param ch
*/
public void deleteChar(Editable s, char ch) {
if (s.length() > 0) {
int pos = s.length() - 1;
char c = s.charAt(pos);
if (c == ch) {
Log.d("mark", "c= " + c);
s.delete(pos, pos + 1);
Toast.makeText(EditTextAndString.this, "Error letter.",
Toast.LENGTH_SHORT).show();
}
}
}


/**
* 删除指定字符 重载方法,可以指定多个需要删除的字符

* @param s
* @param ch
*/
public void deleteChar(Editable s, char[] ch) {
if (s.length() > 0) {
int pos = s.length() - 1;
char c = s.charAt(pos);
int len = ch.length;
for (int i = 0; i < len; i++) {
if (c == ch[i]) {
Log.d("mark", "c= " + c);
s.delete(pos, pos + 1);
Toast.makeText(EditTextAndString.this, "Error letter.",
Toast.LENGTH_SHORT).show();
}
}
}
}


/**
* 该字符是否包含中文字符

* @param c
*            字符
* @return 如果包含中文返回true,否则false
*/
public boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}


/**
* 该字符串是否包含中文字符

* @param str
*            字符串
* @return 如果包含中文返回true,否则返回false
*/
public boolean isChinese(String str) {
if ((str != null) && (!"".equals(str))) {
char[] ch = str.toCharArray();
int len = ch.length;
for (int i = 0; i < len; i++) {
// Log.d("mark", "<---> " + ch[i]);
if (isChinese(ch[i])) {
result.append("该字符串中第一个中文:" + ch[i] + "\n");
return true;
}
}
}
return false;
}


/**
* 去除字符串中所有空格

* @param s
*            字符串
* @return 字符串

*         注意:String类的trim()只可以去除两端的空格
*/
public String removeAllSpace(String s) {
String endString = "";
StringBuilder builder = new StringBuilder(endString);
int len = s.length();
for (int i = 0; i < len; i++) {
// 获得字符
char c = s.charAt(i);
// 如果该字符不是空格
if (c != SPACE) {
builder.append(String.valueOf(c));
}
}
return builder.toString();
}
}

关于代码,很简单,没什么可以细说的。自己运行看看即可,主要提供一下思路。下面说说 TextUtils 这个类的 isEmpty() 方法。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

获取EditText内容的方法,如下(大家都知道!!!!!):

EditText对象.getText().toString()


可以获得String对象,为了防止用户输入空格,可以采用:

EditText对象.getText().toString().trim()
不过这种方法只可以去除该字符串左右的空格,关于如何去除所有空格的方法,参照上面代码实例。

如登录对话框中,获取用户名和密码,我们首先需要判断用户是否输入:

if(TextUtils.isEmpty(str)) {
    	Toast.makeText(this, "输入为空!", Toast.LENGTH_LONG).show();
}
这里主要用到 TextUtils 这个类的 isEmpty() 方法,其源码:

 /**
     * Returns true if the string is null or 0-length.
     * @param str the string to be examined
     * @return true if str is null or zero length
     */
    public static boolean isEmpty(CharSequence str) {
        if (str == null || str.length() == 0)
            return true;
        else
            return false;
    }

可以看出,如果字符串为 Null 或者长度为 0 时,返回 true。

这里需要注意两个问题:

<1> 在 EditText 中输入空格算一个字符

<2>  在 EditText 中输入回车算一个字符


所以,在开发中,一般这样书写代码(个人觉得):

String str = EditText对象.getText().toString();//.trim();
    	if(TextUtils.isEmpty(str)) {
    	// ToDo
}
如果不想用户输入回车键,就可以设置 EditText 为单行显示。

android:singleLine="true"
对应 Java 代码:

setSingleLine(true);
或者(调用 setSingleLine(true)):

setSingleLine();




©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页