Android怎么关闭EditText中的软键盘
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android怎么关闭EditText中的软键盘相关的知识,希望对你有一定的参考价值。
android要关闭EditText中的软键盘,要分以下两种情况。分别是EditText有焦点(focusable为true)和当EidtText无焦点(focusable=false)。
1、EditText有焦点(focusable为true)阻止输入法弹出
先绑定EditText的资源id然后设置setOnTouchListener监听方法,在该方法里设置
关闭软键盘 (setInputType(InputType.TYPE_NULL); )方法。代码如下。
editText=(EditText)findViewById(R.id.txtBody);
editText.setOnTouchListener(new OnTouchListener()
public boolean onTouch(View v, MotionEvent event)
editText.setInputType(InputType.TYPE_NULL); // 关闭软键盘
return false;
);
2、当EidtText无焦点(focusable=false)时阻止输入法弹出。
这种情况先得到InputMethodManager类(InputMethodManager这个类来可以实现对软盘的控制),得到该类之后之间调用hideSoftInputFromWindow()方法即可。
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
editText=(EditText)findViewById(R.id.txtBody); editText.setOnTouchListener(new OnTouchListener() public boolean onTouch(View v, MotionEvent event) editText.setInputType(InputType.TYPE_NULL); // 关闭软键盘 return false; );
2、当EidtText无焦点(focusable=false)时阻止输入法弹出
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);本回答被提问者采纳
如何通过android中的软键盘以编程方式将我的EditText输入限制为反斜杠(/),tild(〜)等特殊字符
【中文标题】如何通过android中的软键盘以编程方式将我的EditText输入限制为反斜杠(/),tild(〜)等特殊字符【英文标题】:How can restrict my EditText input to some special character like backslash(/),tild(~) etc by soft keyboard in android programmatically 【发布时间】:2014-03-16 16:54:15 【问题描述】:我正在开发键盘应用程序,但遇到了问题。 我想以编程方式在 android 的 EditText 中限制/阻止软键盘中的一些特殊字符。
那么,有什么方法可以限制在 android 的编辑文本中输入任何特殊字符。
如果有人有想法,请回复。
提前致谢。
【问题讨论】:
android:digits="~/\#^|" 您要限制哪些特殊字符; 感谢您的回复。我正在测试,然后回复您。 【参考方案1】:试试这个可能对你有用
public class MainActivity extends Activity
private EditText editText;
private String blockCharacterSet = "~#^|$%&*!";
private InputFilter filter = new InputFilter()
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
if (source != null && blockCharacterSet.contains(("" + source)))
return "";
return null;
;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
editText.setFilters(new InputFilter[] filter );
【讨论】:
它工作正常,但我需要更多帮助。如何重新设置货币符号,如 £、€ 等。 在 blockCharacterSet @jagdish 中添加要限制的字符 @Sanket990 你可以使用 \" 。 用户仍然可以将这些无效字符粘贴到编辑文本中 解决方案是对每个字符进行循环检查,如下所示:***.com/a/7335559/1235910【参考方案2】:如果你想添加空格,你可以在最后一个数字后面加空格。
android:digits="0123456789qwertzuiopasdfghjklyxcvbnm "
【讨论】:
如果您在最后一位添加空格,则不会考虑。如果你想给空间,那么在数字或字母之间给它。不要给它,最后和开始。 @tara 你可以在任何地方加上双引号(“”)。这对我有用。【参考方案3】:这应该可行:
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.isLetterOrDigit(source.charAt(i)))
return "";
return null;
;
edit.setFilters(new InputFilter[]filter);
或者,如果您更喜欢简单的方法:
<EditText android:inputType="text" android:digits="0123456789*,qwertzuiopasdfghjklyxcvbnm" />
【讨论】:
其实你不必指定逗号【参考方案4】:查看this 链接,该链接显示如何限制 Android EditText 字段中的特殊字符?
试试这个代码
android:digits="abcde.....012345789"
我想这是最简单的方法。希望对您有所帮助。
【讨论】:
它阻止单引号和双引号,空格【参考方案5】:它已经晚了,但可能对其他人有帮助。 您可以使用 xml 属性而不是编程方式。可能的情况是,在单一布局中,您有许多 editText,您希望将特殊字符限制在一个 EditText 中。所以在 xml 中定义会帮助你。这是通过允许特殊字符只输入字母和数字来限制特殊字符的代码,如下所示
<EditText
android:id="@+id/editText"
android:layout_
android:layout_
android:textSize="@dimen/text10"
android:singleLine="true"
android:maxLines="1"
android:maxLength="16"
android:digits="abcdefghijklmnopqrstuvwxyz0123456789"/>
【讨论】:
【参考方案6】:对于那些在添加空间时可能遇到问题的人,请添加一个包含所有字母的空格。下面是一个例子 此外,您应该知道在这种情况下用户将无法添加新行。
<EditText
android:layout_
android:layout_
android:inputType="text"
android:digits="0123456789,a bcdefghijklmnopqrstuvwxyz"
android:maxLines="1"
android:singleLine="true" />
【讨论】:
【参考方案7】:首先需要添加允许字符的DigitsKeyListener,然后setRawInputType到edittext字段
edit_field.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
edit_field.setRawInputType(InputType.TYPE_TEXT_VARIATION_PERSON_NAME);
【讨论】:
这对我有帮助,因为它适用于粘贴【参考方案8】:您可以创建正则表达式并在 onTextChanged 方法上检查它
yourEditText.addTextChangedListener(new TextWatcher()
public void afterTextChanged(Editable s)
// you can call or do what you want with your EditText here
yourEditText. ...
public void beforeTextChanged(CharSequence s, int start, int count, int after)
public void onTextChanged(CharSequence s, int start, int before, int count)
);
【讨论】:
【参考方案9】:您可以防止输入特殊字符:
yourEditText.addTextChangedListener(new TextWatcher()
CharSequence previous;
public void afterTextChanged(Editable s)
if(s.toString().contains("&^%$#*&("))
s.clear();
s.append(previous.toString());
public void beforeTextChanged(CharSequence s, int start, int count, int after)
previous = s;
public void onTextChanged(CharSequence s, int start, int before, int count)
);
【讨论】:
【参考方案10】:不幸的是,接受的解决方案并非在所有情况下都有效。正确的解决方案是使用以下InputFilter
:
private InputFilter filter = new InputFilter()
// An example pattern that restricts the input only to the lowercase letters
private static final Pattern restrictedChars = Pattern.compile("[a-z]*")
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
final CharSequence replacementText = source.subSequence(start, end);
final CharSequence replacedText = dest.subSequence(dstart, dend);
if (source == null || restrictedChars.matcher(replacementText).matches())
return null; // Accept the original replacement
return replacedText; // Keep the original text
;
此解决方案与公认的解决方案不同之处在于它解决了以下问题:
只有源的子序列是替换,而不是完整的源 来源不一定只包括新输入的文本,有时它是迄今为止输入的全文【讨论】:
【参考方案11】:这个答案的 kotlin 版本
class NameActivity : AppCompatActivity()
var myFilter =
InputFilter source, _, _, _, _, _ ->
try
val c = source[0]
return@InputFilter if (Character.isLetterOrDigit(c) || c == '_' || c == '.')
"$c"
else
// here you can show error msg
""
catch (e: Exception)
null
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_name)
val edittext = findViewById<EditText>(R.id.edittext)
edittext.filters = (arrayOf(myFilter))
【讨论】:
【参考方案12】:这对我有用...
android:digits="÷×=%_-+#().,abcdefghijklmnopqrstuvwxyzA BCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n\u0020"
空间使用:
\u0020
换行:
\n
对于 ime 选项使用:
android:singleLine="true"
android:maxLines="1"
希望它对你有用...
【讨论】:
【参考方案13】:接受的答案仍然允许用户粘贴不需要的字符。此解决方案有效:
您所要做的就是:
List<String> unwantedChars = new ArrayList<>(Arrays.asList("@", "€"));
editText.addTextChangedListener(new FilterUnwantedChars(editText, unwantedChars));
助手类:
public class FilterUnwantedChars implements TextWatcher
private List<String> unwantedChars;
private EditText editText;
private boolean listenToTextChange;
public FilterUnwantedChars(EditText editText, List<String> unwantedChars)
this.unwantedChars = unwantedChars;
this.editText = editText;
this.listenToTextChange = true;
@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 (!listenToTextChange)
listenToTextChange = true;
return;
String result = s.toString();
final String oldString = result;
for (String unwanted : unwantedChars)
result = result.replace(unwanted, "");
if (!oldString.equals(result))
listenToTextChange = false;
int currentPos = editText.getSelectionStart()-1;
editText.setText(result);
try
editText.setSelection(currentPos);
catch (Exception e)
// nothing
@Override
public void afterTextChanged(Editable s)
public void setEditText(EditText editText)
this.editText = editText;
public EditText getEditText()
return editText;
public List<String> getUnwantedChars()
return unwantedChars;
public void setUnwantedChars(List<String> unwantedChars)
this.unwantedChars = unwantedChars;
【讨论】:
【参考方案14】:可以使用filters
解决,即
val regex = Regex("^[~#^|$%&*!]*$")
val filter = InputFilter source, _, _, _, _, _ ->
return@InputFilter when
source?.matches(regex) == true -> ""
else -> null
editText.filters = arrayOf(filter)
对于处理copy-pasted
文本,可以通过添加条件来检查输入的文本是否大于1
,现在看起来像这样
val regex = Regex("^[~#^|$%&*!]*$")
val filter = InputFilter source, _, _, _, _, _ ->
return@InputFilter when
source?.matches(regex) == true -> ""
source.length > 1 -> source.trim it.toString().matches(regex) // Put your desired logic here, these sample logic was doing a trim/remove
else -> null
editText.filters = arrayOf(filter)
【讨论】:
以上是关于Android怎么关闭EditText中的软键盘的主要内容,如果未能解决你的问题,请参考以下文章
如何通过android中的软键盘以编程方式将我的EditText输入限制为反斜杠(/),tild(〜)等特殊字符
Android - 隐藏EditText弹出的软键盘输入(SoftInput)