默认情况下带数字键盘的EditText,但允许输入字母字符。

88

我有一个EditText框,希望在选中它时默认弹出数字键盘,因为大多数情况下用户会输入数字。但是,如果需要,我也想允许用户输入字母字符。使用android:inputType="number"限制了输入仅限于数字。我有哪些选项?


3
你好,你有解决方案吗?如果有,请分享给我。我需要实现相同的内容。 - Sneha Bansal
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Dhrumil Shah - dhuma1981
这个问题已经有答案了,可以在这里找到:https://dev59.com/eW025IYBdhLWcg3wNC92#8776491 - Rahul Tiwari
可能是重复问题。 此问题已在类似的帖子中得到解答。 - hrk_er
19个回答

21

在xml中这样定义EditText:

<EditText 
    android:id="@+id/txtOppCodigoCliente"
    android:inputType="textVisiblePassword"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:maxLength="11"
    android:hint="@string/strCodigoCliente"/>

输出: android:inputType="textVisiblePassword"

一行数字和其他字母。


3
这应该是被选中的答案! - Tash Pemhiwa
这取决于键盘。在我的情况下,它不能与最新版本的Google键盘和Nougat一起使用。 - fireb86
你解决了问题吗? - Ashwin S Ashok
this._editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); this._editText.setTypeface(Typeface.DEFAULT); 对我有效。 - xevser
@fireb86,它可以与最新版本的Gboard一起使用。在Oreo上运行得非常完美。 - Tim John

11

我建议采用更为严谨的解决方案:

让用户能够选择输入类型:

需要修复的问题

- 更好地处理显示/隐藏输入选择按钮

- 当输入类型为字母时,可能要删除建议

输入图像描述

以下是活动:

package mobi.sherif.numberstexttextview;

import android.os.Bundle;
import android.app.Activity;
import android.text.InputType;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.widget.EditText;

public class MainActivity extends Activity {

    EditText mEdit;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEdit = (EditText) findViewById(R.id.input);
        mEdit.setOnFocusChangeListener(new OnFocusChangeListener() {

            @Override
            public void onFocusChange(View view, boolean focused) {
                findViewById(R.id.llmenu).setVisibility(focused?View.VISIBLE:View.GONE);
            }
        });
    }

    public void onNumbers(View v) {
        mEdit.setInputType(InputType.TYPE_CLASS_NUMBER);
    }

    public void onLetters(View v) {
        mEdit.setInputType(InputType.TYPE_CLASS_TEXT);
    }

}

这里是活动的 xml:activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ScrollView
        android:id="@+id/scrollview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignWithParentIfMissing="true"
        android:layout_above="@+id/llmenu" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <EditText
                android:id="@+id/input"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="number" >

                <requestFocus />
            </EditText>
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:id="@+id/llmenu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="#000000"
        android:padding="0dp" >

        <Button
            android:id="@+id/buttonnumbers"
            android:layout_width="0dp"
            android:onClick="onNumbers"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Numbers" />

        <Button
            android:id="@+id/buttonletters"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onLetters"
            android:text="Letters" />
    </LinearLayout>

</RelativeLayout>

如果数字是输入类型之一并且键盘处于全屏模式(横向),则字母会被隐藏。当切换回文本输入类型时,它们会再次出现。 - OneWorld

10

以下是您要查找的内容:

按照以下方式在xml中定义您的EditText

<EditText
    android:id="@+id/etTest"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/hint">

</EditText>

在您的onCreate()中调用以下内容:

etTest = (EditText) findViewById(R.id.etTest);
etTest.setRawInputType(InputType.TYPE_CLASS_NUMBER);
// Note the "Raw"

现在,每当您点击 EditText 时,您可以输入数字和字母!(数字键盘首先显示)


4
在我的Nexus 7上,它显示了数字键盘,但没有显示普通键盘的方法。 - Rob
看起来很有前途,但如果数字是输入类型之一并且键盘处于全屏模式(横向),则字母会被隐藏。 - OneWorld

8
很遗憾,这是不可能的,因为EditText只能设置一个inputType。以下内容仅会在按钮上显示字母字符。
<EditText
        android:id="@+id/editText1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="text|number" />

然而,我可以建议您将输入类型设置为数字,并在靠近数字键盘的表单中添加一个小型switchKeyboard按钮。并设置其onClick属性。
editText1.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

这样用户也可以切换到字母字符。


原因在于文档。仔细查看常量名称。您只能将一个类与一个变体和一个标志组合在一起,例如TYPE_CLASS_NUMBER | TYPE_NUMBER_FLAG_SIGNED。但是您永远不能混合使用numbertext这样的类。 - OneWorld
文档确实没有说明类不能混合使用。也没有任何lint检查报错。甚至在组合例如number|text时,还有一个特定的键盘,这意味着您可以通过长按输入字母,但实际上并不起作用。看起来对我来说相当有缺陷,或者至少是不完整的。 - masc3d
@masc3d - 同意文件没有明确说明它应该位于哪里。在InputType下提到,在TYPE_MASK_CLASS的描述中: 决定给出的文本的总体类别的位掩码。支持的类别有:TYPE_CLASS_TEXT、TYPE_CLASS_NUMBER、TYPE_CLASS_PHONE、TYPE_CLASS_DATETIME。 IME作者:如果这个类别不是你理解的其中之一,请假设TYPE_CLASS_TEXT,并且没有变化或标志。 - ToolmakerSteve

6
基本上,EditText的输入类型用于在EditText中设置输入类型。
android:inputtype 可能的值有:
- text - textCapCharacters - textCapWords - textCapSentences - textAutoCorrect - textAutoComplete - textMultiLine - textImeMultiLine - textNoSuggestions - textUri - textEmailAddress - textEmailSubject - textShortMessage - textLongMessage - textPersonName - textPostalAddress - textPassword - textVisiblePassword - textWebEditText - textFilter - textPhonetic - number - numberSigned - numberDecimal - phone - datetime - date - time 然后你可以像例子中展示的那样使用任何一个值。
<EditText android:id="@+id/EditText01"
 android:layout_height="wrap_content"
 android:layout_width="fill_parent"
 android:inputType="number"
 android:text="1212223"/>

3
谢谢!我甚至找不到列出所有这些内容的Google Android文档! - gimmegimme

4

Asus平板电脑具有该功能,他们已经定制了默认键盘。键盘只包含数字和字母。我认为您的要求解决方案也应该定制默认键盘。


3
在这种情况下,您不应使用任何inputType过滤器,只需在EditText属性中添加以下行:
android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "

现在只允许输入这些特定字符到EditText中。

您的edittext完整代码将如下所示:

<EditText
 android:id="@+id/etTest"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:ems="10"
 android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "
 android:hint="@string/hint">


1
完美的解决方案!谢谢! - BSQ

2
在Activity的OnCreate方法中,执行以下操作:
    t = (EditText) findViewById(R.id.test);
    t.setKeyListener(new KeyListener() {

        @Override
        public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {
            return false;
        }

        @Override
        public boolean onKeyOther(View view, Editable text, KeyEvent event) {
            return false;
        }

        @Override
        public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {
            if (keyCode == 67) { // Handle backspace button =)
                if (text.length() > 0) {
                    t.setText(text.subSequence(0, text.length() - 1));
                    t.setSelection(text.length()-1);
                }
            }
            return false;
        }

        @Override
        public int getInputType() {
            return InputType.TYPE_CLASS_NUMBER;
        }

        @Override
        public void clearMetaKeyState(View view, Editable content, int states) {

        }
    });

在此情况下,您的类型为 number ,Android将显示数字键盘,但您可以输入任何内容。 此外,您可以根据需要覆盖其他方法。

你尝试过在全屏模式下,横向使用吗? - OneWorld

2
您可以按照Paresh Mayani的答案进行操作。
并且建议您根据用户选择使用android:inputType="textPhonetic"作为输入类型文本和数字。
希望您能理解我的意思。

2

以下是我实现它的方法...

android:inputType="textPhonetic|numberDecimal" android:digits="/0123456789.abcdefghijklmnopqrstuvwxyz"

只有digits指定的字符将被允许输入。

请注意,显示的键盘是拨号键盘,而不是普通键盘。对我来说,在XML中完全实现了我需要的功能。


2
不要混合输入类。它们总是会产生数字。请参见https://dev59.com/ZnA65IYBdhLWcg3w9DmF#QmYRoYgBc1ULPQZFiUZr - OneWorld
谢谢 slamn,我需要使用整数和“-”/减号运算符。 - gimmegimme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接