日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 只能输入汉字,EditText限制输入的几种方式及只显示中文汉字的做法

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 只能输入汉字,EditText限制输入的几种方式及只显示中文汉字的做法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前段時間項目中有個需求是要求只能輸入漢字,并且不能輸入偏旁部首,于是總結了下EditText限制輸入的幾種方式,但是對于語音輸入的還沒找到好的解決方案:

通過設置EditText的inputType來限制,可以在xml或者java代碼中設置:

在xml中設置:android:inputType="textPassword"

在java代碼中設置: mEditText.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

可以通過設置不同屬性來限制輸入內容。

通過設置EditText的android:digits 屬性來限制可輸入的內容,但需要把允許輸入的內容全都羅列出來,只適合允許輸入少數限制的情況,如只允許輸入數字,像這種只能輸入漢字的情況明顯不適合,總不能把幾千個漢字全都羅列出來吧。

通過InputFilter來限制。

/**

* EditText限制只能輸入漢字

*/

public InputFilter getInputFilter() {

InputFilter filter = new InputFilter() {

public CharSequence filter(CharSequence source, int start, int end,

Spanned dest, int dstart, int dend) {

if (TextUtils.isEmpty(source)){

return "";

}

for (int i = start; i < end; i++) {

if (stringFilterChinese(source) && !source.toString().contains("。") && !source.toString ().contains(",")) {

return "";

} else if (CHINESE_RADICAL_DIGISTS.contains(source)) {

return "";

}

}

return null;

}

};

return filter;

}

/**

* 限制只能輸入漢字,過濾非漢字

*

* @param str 輸入值

* @return true 非漢字;false 漢字

*/

public boolean stringFilterChinese(CharSequence str) {

//只允許漢字,正則表達式匹配出所有非漢字

String regEx = "[^\u4E00-\u9FA5]";

Pattern p = Pattern.compile(regEx);

Matcher m = p.matcher(str);

if (m.find()) {

return true;

} else {

return false;

}

}

mEdtAddDictation.setFilters(new InputFilter[]{getInputFilter()});

查看TextView的源碼,在setText中通過調用filter()過濾了相關內容:

private void setText(CharSequence text, BufferType type,boolean notifyBefore, int oldlen) {

...

int n = mFilters.length;

for (int i = 0; i < n; i++) {

CharSequence out = mFilters[i].filter(text, 0, text.length(), EMPTY_SPANNED, 0, 0);

if (out != null) {

text = out;

}

}

...

}

通過TextWatch來限制輸入。

mEdtAddDictation.addTextChangedListener(mTextWatcher);

private TextWatcher mTextWatcher = new TextWatcher() {

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

this.temp = s;

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override

public void afterTextChanged(Editable editable) {

String words = editable.toString().trim();

if (TextUtils.isEmpty(words)) {

mBtnAddSure.setEnabled(false);

} else {

mBtnAddSure.setEnabled(true);

}

if (TextUtils.isEmpty(words)) {

return;

}

String newWords = words;

newWords = StringUtils.clearLimitStr(StringUtils.DEFAULT_REGEX_LIMIT_CHINESE,newWords);

newWords = StringUtils.clearLimitStr(StringUtils.CHINESE_RADICAL_DIGISTS,newWords);

boolean isChange = false;

if (!TextUtils.equals(words,newWords)){

isChange = true;

words = newWords;

}

if (words.length() > MAX_INPUT_LIMIT) {

ToastUtils.getInstance(AddDictationWordsActivity.this).s(R.string.dictation_add_word_limit);

words = words.substring(0, MAX_INPUT_LIMIT);

isChange = true;

}

if (isChange) {

mEdtAddDictation.removeTextChangedListener(this);

// et.setText方法可能會引起鍵盤變化,所以用editable.replace來顯示內容

editable.replace(0, editable.length(), words.trim());

mEdtAddDictation.addTextChangedListener(this);

}

}

};

/**

* 清除不符合條件的內容

*

* @param regex

* @return

*/

public static String clearLimitStr(String regex, String str) {

return str.replaceAll(regex, "");

}

/**

* 默認的篩選條件(正則:只能輸入中文)

*/

public static String DEFAULT_REGEX_LIMIT_CHINESE = "[^\u4E00-\u9FA5]";

/**

* 偏旁部首

*/

public static final String CHINESE_RADICAL_DIGISTS = "[犭凵巛冖氵廴纟讠礻亻钅宀亠忄辶弋饣刂阝冫卩疒艸疋豸冂匸扌丬屮衤勹彳彡]";

通過自定義InputConnectionWrapper來限制輸入。

步驟:

(1)自定義EditText,重載onCreateInputConnection方法,它需要返回一個InputConnection對象;

(2)繼承于InputConnectionWrapper, 實現自己的InputConnection 并且在onCreateInputConnection中返回。

(3)在自定義的InputConnectionWrapper類中,實現輸入法輸入和按鍵事件的攔截。

由于InputConnection是在文本顯示之前進行調用,因此可以通過重寫其中的方法修改要顯示的內容。

/**

* @author zhangshao

* @desc 只能輸入漢字的輸入框

* @time 2018/11/8 18:09

*/

@SuppressLint("AppCompatCustomView")

public class ChineseLimitEditText extends EditText {

public ChineseLimitEditText(Context context) {

super(context);

}

public ChineseLimitEditText(Context context, AttributeSet attrs) {

super(context, attrs);

}

public ChineseLimitEditText(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

/**

* 輸入法

*

* @param outAttrs

* @return

*/

@Override

public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

return new InnerInputConnecttion(super.onCreateInputConnection(outAttrs),

false);

}

class InnerInputConnecttion extends InputConnectionWrapper implements InputConnection {

public InnerInputConnecttion(InputConnection target, boolean mutable) {

super(target, mutable);

}

/**

* 對輸入的內容進行攔截

*

* @param text

* @param newCursorPosition

* @return

*/

@Override

public boolean commitText(CharSequence text, int newCursorPosition) {

// 只能輸入漢字

if (!TextUtils.isEmpty(text) && (!StringUtils.isContainChinese(text.toString()) ||

StringUtils.isContainRadical(text.toString()))) {

return false;

}

return super.commitText(text, newCursorPosition);

}

@Override

public boolean sendKeyEvent(KeyEvent event) {

// 攔截換行鍵

return event.getKeyCode() != KeyEvent.KEYCODE_ENTER && super.sendKeyEvent(event);

}

@Override

public boolean setSelection(int start, int end) {

return super.setSelection(start, end);

}

}

}

/**

* 字符串是否包含中文

* */

public static boolean isContainChinese(String str) {

Pattern p = Pattern.compile("[\u4e00-\u9fa5]");

Matcher m = p.matcher(str);

if (m.find()) {

return true;

}

return false;

}

/**

* 字符串是否包含偏旁部首

* */

public static boolean isContainRadical(String str) {

Pattern p = Pattern.compile(CHINESE_RADICAL_DIGISTS);

Matcher m = p.matcher(str);

if (m.find()) {

return true;

}

return false;

}

攔截條件:在commitText方法中,如果執行父類的 commitText(即super.commitText(text, newCursorPosition))那么表示不攔截,如果返回false則表示攔截,

輸入法的字符串則無法傳送到EditText。在sendKeyEvent中,如果執行父類的sendKeyEvent(即super.sendKeyEvent(event))那么表示不攔截,如果返回false表示攔截。

不同的需求可以通過不同的限制方法組合使用,不用局限于一種。

以上幾種方法都可以解決軟鍵盤輸入時只顯示中文的問題,但是搜狗輸入法的語音輸入無法過濾,一旦在InputFilter或者TextWatch中屏蔽,那么語音輸入內容會重復,目前分析的原因是:語音輸入是持續輸入,如果去掉相應的標點,那么輸入法會檢測到輸入內容與緩存的不對應,會把之前的文本拿出來重新拼接在一起返回。如果有朋友有好的解決方案,還望不吝賜教!

總結

以上是生活随笔為你收集整理的android 只能输入汉字,EditText限制输入的几种方式及只显示中文汉字的做法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。