我是一个专门用android编程的新手。 我在我的应用程序中使用SearchView但我不知道如何阻止特殊字符。 我见过有关EditText的主题,但没有关于SearchView的内容,我需要帮助。
我在App栏中使用SearchView和这个xml菜单:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/search"
android:icon="@drawable/ic_search_white_24dp"
android:title="@string/search_title"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always" />
</menu>
和此活动代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_results);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search_option_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
}
所以我等你的答案,谢谢。
答案 0 :(得分:1)
您可以检测输入字符的时间:
//In onCreate
EditText et;//initialize
et.addTextChangedListener(tw);
在onCreate之外:
private TextWatcher tw = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//If the text contains a "bad" char, (char that isn't equal to A-Z/a-z or 0-9, remove it from the edittext
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
};
(edittext应声明为类变量)
关于检测的建议:
//s is the char sequence
String string = s.toString();
boolean found = false;
StringBuilder sb = new StringBuilder();
for(int i = 0; i < s.length(); i++){
String ch = s.charAt(i) + "";//Convert to check with regex
if(!Pattern.compile("[A-Z|a-z|0-9]").matcher(ch).find()){
found = true;
}else{
sb.append(ch);
}
}
if(found){
editText.setText(sb.toString());//only apply the text if a special char is found
}
我对特殊字符的解释是非数字和非A-Z。可以修改此项以匹配您认为特殊的任何字符。如果您想要禁用几个字符,最好检查这些字符而不是检查它是否包含所有其他字符。
答案 1 :(得分:0)
我遇到了将“>”转换为“ |>”的问题。这就是我用Kotlin修复的方式:
override fun onQueryTextChange(newText: String?): Boolean {
Log.w(TAG, "new text $newText")
if (newText != null && newText.contains("|>")) {
val text = newText?.replace("|>", ">")
search.setQuery(text, false)
} else {
// do something
}
return false
}