默认情况下,带有数字小键盘的EditText,但允许字母字符


82

我有一个EditText框,我希望将默认键盘选为数字小键盘时出现,因为大多数情况下,用户将输入数字。但是,如果需要,我确实希望允许用户输入字母字符。使用android:inputType="number"将输入限制为仅数字。我有什么选择?


2
嗨,您有解决方案吗?如果是,请分享。我必须实施相同的解决方案
Bansal_Sneha 2014年

您是否要让用户仅以数字开头,然后在超过1个数字后允许他/她输入字母数字?
dhuma1981'2

这有一个答案在这里
拉胡尔·蒂瓦里

可能重复。在类似的帖子中
hrk_er,2015年

Answers:


16

通过以下方式在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
这应该是选择的答案!
塔什·佩希瓦

这取决于键盘。就我而言,不适用于最新版本的Google键盘和牛轧糖。
fireb86

您是否解决了问题
Ashwin S Ashok

this._editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); this._editText.setTypeface(Typeface.DEFAULT); 为我工作
xevser

@ fireb86它可以与最新版本的Gboard一起使用。它在Oreo上的工作效果非常好。
蒂姆·约翰

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>

如果数字是inputTypes之一,并且键盘处于全屏模式(横向),则字母被隐藏。当切换回TEXT inputType时,它们再次出现。
OneWorld 2015年

10

这是您要寻找的:

通过EditText以下方式在您的xml中定义您的代码:

<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现在时,都可以输入数字和字母!(首先显示数字键盘)


3
对于我来说,在Nexus 7上它显示了数字键盘,但无法显示普通键盘。
罗布2014年

看起来很有希望,但是如果数字是inputTypes之一,并且键盘处于全屏模式(横向),则字母会被隐藏。
OneWorld 2015年

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
寰宇一家

该文档当然没有声明不能混合类。没有皮棉支票对此抱怨。甚至在组合例如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

  • 文本
  • textCapCharacters
  • textCapWords
  • textCapSentences
  • textAutoCorrect
  • textAutoComplete
  • textMultiLine
  • textImeMultiLine
  • textNoSuggestions
  • textUri
  • textEmailAddress
  • textEmailSubject
  • textShortMessage
  • textLongMessage
  • textPersonName
  • textPostalAddress
  • textPassword
  • textVisiblePassword
  • textWebEditText
  • textFilter
  • 文字语音
  • numberSigned
  • 数字小数
  • 电话
  • 约会时间
  • 日期
  • 时间

那么您可以使用任何值,如示例所示:

<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 '02

4

华硕平板电脑具有该功能,他们自定义了默认键盘。并且键盘仅包含数字和字母。我认为您的需求解决方案也无法自定义默认键盘


2

您可以按照Paresh Mayani的回答。

在建议中,您可以android:inputType="textPhonetic"根据用户选择将inputType用作文本和数字。

希望你能理解我的意思。


2

在活动中的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) {

        }
    });

在这种情况下,您输入is,number并且android将显示数字键盘,但是您可以输入任何想要的内容。您也可以根据需要覆盖其他方法。


当键盘处于全屏模式时,您是否在横向模式下尝试过?
OneWorld 2015年

2

这是我实现的方式...

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

仅允许使用数字指定的字符。

请注意,显示的键盘是拨号器的键盘,而不是典型的键盘。对我来说,它完全实现了XML所需的功能。


1
不要混合输入类。他们总是会导致数字。见stackoverflow.com/questions/3544214/...
寰宇一家

感谢slamn,我只需要使用整数和“-” /减运算符
gimmegimme,2017年

2

在这种情况下,您不应使用任何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

1

为什么不仅仅具有以下任一切换按钮:

  • 将输入类型设置为仅允许数值
  • 设置输入类型以允许使用QWERTY键盘
  • 或设置其他输入类型(如果需要)

这样,您可以将数字小键盘设置为默认键盘,然后用户可以通过按按钮进行更改。


1

给定当前各种手机的默认Android输入类型,这是不可能的

有许多可能的技巧可以在某些键盘上起作用,但不适用于其他键盘,例如答案中通常包含的设置原始输入类型的常用方法:

  • editText.setRawInputType(InputType.TYPE_CLASS_NUMBER)

我能找到的最佳建议是textPostalAddress在XML中使用输入类型:

  • android:inputType="textPostalAddress"

不幸的是,这并不做我们想做的事情还没有,但也许它会在未来。这样做的唯一好处是,编辑框上的元信息将反映您的意图。


1

通过编程,可以对常规流程进行一些调整。首先,您必须将editText设置为:

editText.setInputType(InputType.TYPE_CLASS_NUMBER);

然后,您必须收听keyevent。按下磅后,再次将InputType设置为InputType.TYPE_CLASS_TEXT。这应该对我有用。

editText.setOnKeyListener(new View.OnKeyListener() 
{
     @Override
     public boolean onKey(View v, int keyCode, KeyEvent event) {
     // TODO Auto-generated method stub
     Log.d("KeyBoard", "Keyboard Test Key Hit");

        switch (keyCode) 
        {
              KeyEvent.KEYCODE_POUND:

              if(editText.setInputType(InputType.TYPE_CLASS_TEXT);
              {                             
                   editText.setInputType(InputType.TYPE_CLASS_TEXT);
                   return true;
              }
         }
     }
}  

0

您可以尝试设置-

editText.setRawInputType(Configuration.KEYBOARD_QWERTY);

了解更多


1
Configuration.KEYBOARD_QWERTY == InputType.TYPE_CLASS_NUMBER == 2
Enyby 2015年

0

在textView的代码中,删除android:inputType中的“文本”。

它应该是,

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

这不能解决他的问题。他想允许使用数字键盘的字母和数字
OneWorld 2015年

0

您可以通过编程方式执行此操作:

// Numbers
mEditText.setInputType(InputType.TYPE_CLASS_NUMBER);

// Text
mEditText.setInputType(InputType.TYPE_CLASS_TEXT);

setInputType(int type)使用为inputType定义的常量设置内容的类型。


0

正如Saurav所说,最好的方法是使用一个简单的侦听器在QWERTY键盘和数字键盘之间切换:

input.setInputType(InputType.TYPE_CLASS_TEXT);

input.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {

        switch (keyCode) {
        case 24: // Volumen UP

             input.setInputType(InputType.TYPE_CLASS_NUMBER);
             break;
         case 25: // Volumen DOWN

             input.setInputType(InputType.TYPE_CLASS_TEXT);
             break;
        }
        return true;
    }
});

0

我尝试了所有方法,但并不完美。所以我有另一个想法。适用于所有键盘。

 @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reset_password);
    editText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);


    // Checks whether a hardware keyboard is available
    if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
        Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
        if (editText.isFocused()) {
            editText.setInputType(InputType.TYPE_CLASS_TEXT);
        }

    } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
        Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
        if (editText.getInputType() == InputType.TYPE_CLASS_TEXT) {
            editText.setInputType(InputType.TYPE_CLASS_NUMBER);
        }
    }
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.