Ответ 1
ее решение для меня:
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
android:inputType="textFilter"
Добавьте его в редактируемый текст в XML файле
В моем приложении для Android мне нужно отключить только пробел. Но я не нашел решения для этой проблемы. Мне нужно отключить пробел, и когда пользователь вводит пробел, он не должен работать, должны работать специальные символы, буквы, цифры и все остальные. Я пробовал,
etPass.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
String str = s.toString();
if(str.length() > 0 && str.contains(" "))
{
etPass.setError("Space is not allowed");
etPass.setText("");
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
Но проблема здесь в том, что после пробела весь текст удаляется. Я удалил
etPass.setText("");
эту строку, поэтому в это время появляется сообщение об ошибке, но в это время пользователь все еще может ввести пробел. Но мне нужно, чтобы пользователь не мог ввести пробел.
ее решение для меня:
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
android:inputType="textFilter"
Добавьте его в редактируемый текст в XML файле
Почему бы вам не подумать о символьном фильтре. Вот пример фрагмента кода.
/* To restrict Space Bar in Keyboard */
InputFilter filter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (Character.isWhitespace(source.charAt(i))) {
return "";
}
}
return null;
}
};
input.setFilters(new InputFilter[] { filter });
Эта версия поддерживает ввод предложений с клавиатуры с помощью пробелов.
InputFilter filter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String filtered = "";
for (int i = start; i < end; i++) {
char character = source.charAt(i);
if (!Character.isWhitespace(character)) {
filtered += character;
}
}
return filtered;
}
};
input.setFilters(new InputFilter[] { filter });
PS: версия Kotlin:
input.filters = arrayOf(InputFilter { source, _, _, _, _, _ ->
source.toString().filterNot { it.isWhitespace() }
})
Попробуйте это
Использовать android:digits
не включать "" (пробел в нем)
<EditText
android:inputType="number"
android:digits="0123456789.abcdefghijklmnl....."// write character that you want to allow
/>
EditText yourEditText = (EditText) findViewById(R.id.yourEditText);
yourEditText.setFilters(new InputFilter[] {
new InputFilter() {
@Override
public CharSequence filter(CharSequence cs, int start,
int end, Spanned spanned, int dStart, int dEnd) {
// TODO Auto-generated method stub
if(cs.equals("")){ // for backspace
return cs;
}
if(cs.toString().matches("[a-zA-Z]+")){ // here no space character
return cs;
}
return "";
}
}
});
В методе afterTextChanged поместите следующий код:
public void afterTextChanged(Editable s) {
String str = etPass.getText().toString();
if(str.length() > 0 && str.contains(" "))
{
etPass.setText(etPass.getText().toString().replaceAll(" ",""));
etPass.setSelection(etPass.getText().length());
}
}
Я попытался использовать решение InputFilter
и не работает для меня, потому что если попытаться нажать клавишу Backspace, весь введенный текст удваивается в EditText
.
Это решение работает для меня в Kotlin
с использованием TextWatcher
:
editText.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { }
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun afterTextChanged(p0: Editable?) {
val textEntered = editText.text.toString()
if (textEntered.isNotEmpty() && textEntered.contains(" ")) {
editText.setText(editText.text.toString().replace(" ", ""));
editText.setSelection(editText.text.length);
}
})
Чтобы отключить использование пространства
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (editclicked) {
if (keyCode == KeyEvent.KEYCODE_SPACE) {
return false
}
} else {
super.onKeyDown(keyCode, event);
}
}
Просто замените это в коде, и он должен работать отлично,
etPass.setText(etPass.getText().toString().replaceAll(" ",""));
Простой и легкий способ сделать это:
Это удалит пробелы из текста при нажатии кнопки:
String s = etPass.getText().toString().replaceAll(" ","");
Вы можете использовать "string s
" везде, где вам нужно.
вместо etPass.setText("");
просто удалите пробел из данных EditText
.
etPass.setText(etPass.getText().toString().trim());
etPass.setSelection(autoComplete.getText().length());
поэтому ваше условие IF
будет следующим:
if(str.length() > 0 && str.contains(" "))
{
etPass.setError("Space is not allowed");
etPass.setText(etPass.getText().toString().trim());
etPass.setSelection(etPass.getText().length());
}
Попробуйте это, и это хорошо работает
Котлин:
editText.filters = arrayOf(object : InputFilter {
override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence? {
// eliminates single space
if (end == 1) {
if (Character.isWhitespace(source?.get(0)!!)) {
return ""
}
}
return null
}
})
Джава:
editText.setFilters(new InputFilter[]{(source, start, end, dest, dstart, dend) -> {
if (end == 1) {
if (Character.isWhitespace(source.charAt(0))) {
return "";
}
}
return null;
}});