在Android EditText中,如何强制写大写?
Posted
技术标签:
【中文标题】在Android EditText中,如何强制写大写?【英文标题】:In Android EditText, how to force writing uppercase? 【发布时间】:2013-04-04 10:00:54 【问题描述】:在我的 android 应用程序中,我有不同的EditText
,用户可以在其中输入信息。但我需要强制用户用大写字母书写。
你知道这样做的功能吗?
【问题讨论】:
【参考方案1】:2021:答案
如果您想从EditTextPreference
获得EditText
,这是唯一的最新答案。
要更改EditText
的值或属性,您需要根据新的AndroidX Kotlin 设置setOnBindEditTextListener
回调。
findPreference<EditTextPreference>("key")?.setOnBindEditTextListener
it.filters = arrayOf<InputFilter>(InputFilter.AllCaps())
【讨论】:
【参考方案2】:仅通过 XML 强制大写锁定是不可能的。第三方库也无济于事。您可以在接收端的文本上执行toUpper()
,但无法在键盘端阻止它
您可以使用 XML 将键盘设置为大写锁定。
Java
您可以将input_type
设置为TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS
。 keyboard
应该尊重这一点。
科特林
android:inputType="textCapCharacters"
【讨论】:
android:inputType="textCapCharacters" 我真的不知道为什么这个答案有这么多的赞成票。该解决方案并不能避免用户禁用大写锁定... @kuzdu 因为没有用于键盘的 API 来控制它,尤其是在 3rd 方键盘中,所以没有办法阻止它。您可以在接收端对文本执行 toUpper(),但无法在键盘端阻止它。 是的,没错。所以我会把这些信息准确地放在答案中......【参考方案3】:简单的kotlin实现
fun EditText.onlyUppercase()
inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS
filters = arrayOf(InputFilter.AllCaps())
PS 看来filters
一开始总是空的
【讨论】:
【参考方案4】:试试这个代码,它会让你的输入变成大写
edittext.setFilters(new InputFilter[] new InputFilter.AllCaps());
【讨论】:
【参考方案5】:你可以使用两种方式。
第一种方式:
在您的 EditText 上设置 android:inputType="textCapSentences"
。
第二种方式:
当用户输入数字时,您必须使用文本观察器并将小写字母更改为大写字母。
edittext.addTextChangedListener(new TextWatcher()
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3)
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3)
@Override
public void afterTextChanged(Editable et)
String s=et.toString();
if(!s.equals(s.toUpperCase()))
s=s.toUpperCase();
edittext.setText(s);
edittext.setSelection(edittext.length()); //fix reverse texting
);
【讨论】:
您的解决方案不起作用,因为它将字符串设置为相反的顺序。 你第一次或第二次使用的方式。 第一个根本不起作用。第二个使文本大写,但我们必须以编程方式将光标设置到句子的末尾。 @Kalanamith 是什么问题 对于第一个选项 textCapSentences 大写句子,你需要 textCapCharacters。【参考方案6】:对我来说,它通过添加 android:textAllCaps="true" 和 android:inputType="textCapCharacters"
起作用<android.support.design.widget.TextInputEditText
android:layout_
android:layout_
android:textAllCaps="true"
android:inputType="textCapCharacters"
/>
【讨论】:
【参考方案7】:尝试使用以下任一代码都可以解决您的问题。
以编程方式:
editText.filters = editText.filters + InputFilter.AllCaps()
XML:
android:inputType="textCapCharacters" with Edittext
【讨论】:
【参考方案8】:建议的解决方案的 Java 1-liner 可能是:
editText.setFilters(Lists.asList(new InputFilter.AllCaps(), editText.getFilters())
.toArray(new InputFilter[editText.getFilters().length + 1]));
注意它需要com.google.common.collect.Lists
。
【讨论】:
【参考方案9】:要获得所有资本,请在您的 XML 中使用以下内容:
<EditText
android:layout_
android:layout_
android:textAllCaps="true"
android:inputType="textCapCharacters"
/>
【讨论】:
你试过这个解决方案吗?当用户开始编辑editext的内容时,这会导致应用程序崩溃【参考方案10】:Xamarin 相当于 ErlVolton 的回答:
editText.SetFilters(editText.GetFilters().Append(new InputFilterAllCaps()).ToArray());
【讨论】:
这就是为什么我喜欢 C# 如此简洁的原因。【参考方案11】:这样做:
// ****** Every first letter capital in word *********
<EditText
android:layout_
android:layout_
android:inputType="textCapWords"
/>
//***** if all letters are capital ************
android:inputType="textCapCharacters"
【讨论】:
【参考方案12】:在 kotlin 中,在 .kt 文件中进行更改:
edit_text.filters = edit_text.filters + InputFilter.AllCaps()
使用合成属性直接访问带有 id 的小部件。 在 XML 中,为您的编辑文本添加几个标志:
<EditText
android:id="@+id/edit_text_qr_code"
android:layout_
android:layout_
...other attributes...
android:textAllCaps="true"
android:inputType="textCapCharacters"
/>
这会将键盘更新为启用大写。
【讨论】:
【参考方案13】:Android 实际上有一个built-in InputFilter just for this!
edittext.setFilters(new InputFilter[] new InputFilter.AllCaps());
小心,setFilters
将重置所有其他通过 XML 设置的属性(即maxLines
、inputType
、imeOptinos
...)。为防止这种情况发生,请将您的过滤器添加到现有的过滤器中。
InputFilter[] editFilters = <EditText>.getFilters();
InputFilter[] newFilters = new InputFilter[editFilters.length + 1];
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
newFilters[editFilters.length] = <YOUR_FILTER>;
<EditText>.setFilters(newFilters);
【讨论】:
是的!这是最好的答案!代码应该是edittext.setFilters(new InputFilter[] new InputFilter.AllCaps());
。
好的,你们是对的,我更新了我的答案。感谢您帮助改进!
为避免覆盖您在 xml 上设置的过滤器(例如 maxLength
),请尝试将 InputFilter.AllCaps()
附加到 editText.getFilters
数组。见***.com/a/18934659/3890983
或者在 Kotlin 中只是 editText.filters = editText.filters + InputFilter.AllCaps()
更好的是:editText.filters += InputFilter.AllCaps()
Kotlin 太棒了!
【参考方案14】:
我正在使用 Visual Studio 2015/Xamarin 为 Android 5.1 和 Android 6.0 构建我的应用程序(两者都安装了相同的 apk)。
当我在我的 axml 中指定 android:inputType="textCapCharacters"
时,AllCaps 键盘在 Android 6.0 上按预期出现,但在 Android 5.1 上却没有。我在我的 axml 中添加了android:textAllCaps="true"
,但在 Android 5.1 上仍然没有 AllCaps 键盘。我使用EditText.SetFilters(new IInputFilter[] new InputFilterAllCaps() );
设置了一个过滤器,当软键盘在 Android 5.1 上显示小写字符时,输入字段现在是 AllCaps。
编辑:我观察到并假设与操作系统相关的行为差异实际上是因为 我在测试设备上使用了不同版本的 Google 键盘。 一旦我将设备更新到最新的 Google 键盘(撰写本文时发布于 2016 年 7 月),“全大写”行为在各个操作系统中都是一致的。现在,所有设备在键盘上都显示小写字符,但输入全大写,因为SetFilters(new IInputFilter[] new InputFilterAllCaps() );
【讨论】:
您好托尼,您似乎创建了 2 个帐户; ***.com/users/6764633/tony-celia 和 ***.com/users/6771440/deeveedee。如果要合并它们,请参阅***.com/help/merging-accounts。 谢谢,马特。将此归结为初学者的学习/错误。在您指出之前,我不记得我创建了另一个帐户。幸运的是,帐户合并功能很简单。很棒的论坛!【参考方案15】:使用输入过滤器
editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]new InputFilter.AllCaps());
【讨论】:
当我按下退格键/删除 btn 时会导致问题【参考方案16】:更好...一个衬里在 Kotlin...
// gets your previous attributes in XML, plus adds AllCaps filter
<your_edit_text>.setFilters(<your_edit_text>.getFilters() + InputFilter.AllCaps())
完成!
【讨论】:
您可以使用属性访问语法编写它:<your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
更好:<your_edit_text>.filters += InputFilter.AllCaps()
只有这种方法对我有用。非常感谢。【参考方案17】:
您可以将android:textAllCaps="true"
属性添加到EditText 中的xml 文件中。这将强制软输入键盘以全部大写模式出现。您输入的值将以大写形式显示。但是,这并不能确保用户只能输入UpperCase
字母。如果他们愿意,他们仍然可以回退到小写字母。如果要确保Edittext
的输出全部大写,则必须使用String
类的toUpperCase()
方法手动转换输入字符串。
【讨论】:
@GustavoAlves,你能告诉我你尝试这个时发生了什么吗?也许我可以调查你的问题。 :) 嗨@Abhishek。设置属性并没有改变任何东西。 EditText 仍然接受大写和小写字符。 是的,如果你想限制你的 EditText 只接受大写字符,那么对你来说,android:inputType = "textCapCharacters" 将是正确的选择。试一试,然后告诉我。 ☺️ 每次输入时都会导致索引越界异常。android:textAllCaps="true"
只是 TextView (***.com/a/28803492/5268730) 的一个属性。请改用android:inputType="textCapCharacters"
。【参考方案18】:
如果你想强制用户在你的EditText中写大写字母默认,你只需要添加android:inputType="textCapCharacters"
。 (用户仍然可以手动更改为小写。)
【讨论】:
没有什么能阻止用户按下“shift”并写一个小写字母。 同意 Fernando,虽然它默认键盘为大写字母,但它不需要它们。 如@Fernando所说,用户可以使用shift键输入小写字母 这是一个很好的解决方案,可以强制用户开始并继续输入大写字母。不勉强他,反正他可以选择用键盘写成小写【参考方案19】:根据接受的答案,此答案的作用相同,但在 Kotlin 中。只是为了简化复制粘贴:·)
private fun EditText.autocapitalize()
val allCapsFilter = InputFilter.AllCaps()
setFilters(getFilters() + allCapsFilter)
【讨论】:
filters += InputFilter.AllCaps()
:D
天哪,那更好!谢谢@crgarridos!【参考方案20】:
只需将以下代码添加到您的 xml 文件的 EditText 中。
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
如果您想同时允许大写文本和数字,请使用以下代码。
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
【讨论】:
这肯定行得通,但它不是一个很好的用户体验。我刚试了一下,由于键盘没有自动大写(至少在 N 上),小写输入的字符被忽略,没有给用户任何反馈,使 UI 看起来很糟糕。 完全同意@MattMatt。如果我们这样做,用户将无法输入小写字母。用户应该能够输入他/她想要的任何大小写,其余的应该自动大写单词【参考方案21】:你应该把android:inputType="textCapCharacters"
和Edittext放在xml文件中。
【讨论】:
AoyamaNanami 写了完全相同的答案。请关注更多当前的问题,这是 2013 年的问题。:) 注意用户可以移位和输入小写字符【参考方案22】:要在单击edittext时获得大写键盘,请在您的xml中使用此代码,
<EditText
android:id="@+id/et"
android:layout_
android:layout_
android:hint="Input your country"
android:padding="10dp"
android:inputType="textCapCharacters"
/>
【讨论】:
【参考方案23】:与其担心处理键盘,为什么不接受任何输入,小写或大写,然后将字符串转换为大写?
以下代码应该会有所帮助:
EditText edit = (EditText)findViewById(R.id.myEditText);
String input;
....
input = edit.getText();
input = input.toUpperCase(); //converts the string to uppercase
这是用户友好的,因为用户不需要知道您需要大写的字符串。 希望这会有所帮助。
【讨论】:
【参考方案24】:edittext.addTextChangedListener(new TextWatcher()
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3)
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3)
@Override
public void afterTextChanged(Editable et)
String s=et.toString();
if(!s.equals(s.toUpperCase()))
s=s.toUpperCase();
edittext.setText(s);
editText.setSelection(editText.getText().length());
);
【讨论】:
以上是关于在Android EditText中,如何强制写大写?的主要内容,如果未能解决你的问题,请参考以下文章
android.widget.RelativeLayout无法强制转换为android.widget.EditText