EditText với bàn phím số theo mặc định, nhưng cho phép các ký tự chữ cái


82

Tôi có một hộp EditText và tôi muốn bàn phím mặc định xuất hiện khi nó được chọn làm bàn phím số, vì hầu hết thời gian người dùng sẽ nhập số. Tuy nhiên, tôi cũng muốn cho phép người dùng nhập các ký tự chữ cái, nếu họ cần. Việc sử dụng android:inputType="number"chỉ giới hạn đầu vào cho các chữ số. Tôi có những lựa chọn nào?


2
Hi có bạn có những giải pháp Nếu có thì hãy chia sẻ nó.Tôi phải thực hiện giống nhau không?
Bansal_Sneha

Bạn có muốn người dùng chỉ bắt đầu bằng số và sau đó nhiều hơn 1 chữ số mà họ có thể cho phép nhập chữ và số không?
dhuma1981

này có một câu trả lời ở đây
Rahul Tiwari

có thể trùng lặp. Câu hỏi đã trả lời trong này tương tự bài
hrk_er

Câu trả lời:


16

Xác định EditText trong xml của bạn theo cách này:

<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"/>

đầu ra: android: inputType = "textVosystemPassword"

Một hàng số và phần còn lại của các chữ cái.


3
Đây nên là câu trả lời được chọn!
Tash Pemhiwa

Nó phụ thuộc vào bàn phím. Trong trường hợp của tôi không hoạt động với các phiên bản cuối cùng của Bàn phím Google và Nougat.
fireb86,

Bạn đã cố định vấn đề
Ashwin S Ashok

this._editText.setInputType (InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); this._editText.setTypeface (Typeface.DEFAULT); làm việc cho tôi
xevser

@ fireb86 nó hoạt động với phiên bản mới nhất của Gboard. Và nó hoạt động hoàn toàn tốt trên Oreo.
Tim John

11

Tôi sẽ đề xuất một giải pháp mạnh mẽ hơn:

Trình bày cho người dùng khả năng chọn kiểu đầu vào:

CÁC KHẮC PHỤC CẦN THIẾT

- xử lý tốt hơn việc hiển thị / ẩn các nút lựa chọn đầu vào

- có thể loại bỏ các đề xuất khi loại đầu vào là chữ cái

nhập mô tả hình ảnh ở đây

Đây là hoạt động:

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);
    }

}

Đây là xml của hoạt động: 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>

Nếu số là một trong các Kiểu đầu vào và bàn phím ở chế độ toàn màn hình (ngang), các chữ cái sẽ bị ẩn. Khi chuyển trở lại TEXT inputType, chúng sẽ xuất hiện trở lại.
OneWorld

10

Đây là những gì bạn đang tìm kiếm:

Xác định của bạn EditTexttrong xml của bạn theo cách này:

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

</EditText>

Và gọi sau trong onCreate():

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

Bất cứ khi nào bạn nhấp vào EditTextbây giờ của bạn , bạn có thể nhập chữ số VÀ chữ cái ! (Bàn phím chữ số được hiển thị đầu tiên)


3
Đối với tôi trên Nexus 7, nó hiển thị bàn phím số nhưng không có cách nào để hiển thị bàn phím thông thường.
Rob

Trông có vẻ hứa hẹn, nhưng nếu số là một trong các kiểu inputTypes và bàn phím ở chế độ toàn màn hình (ngang), các chữ cái sẽ bị ẩn.
OneWorld

8

Rất tiếc, điều này là không thể, vì chỉ có thể đặt một inputType cho một EditText. Phần sau sẽ chỉ hiển thị các ký tự chữ cái trên các nút.

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

Tuy nhiên, những gì tôi có thể gợi ý cho bạn là, hãy đặt kiểu nhập của bạn thành số và chỉ cần thêm một nút SwitchKeyboard nhỏ trên biểu mẫu của bạn gần với phím số. Và đặt onClick của nó

editText1.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

để người dùng cũng có thể chuyển sang các ký tự chữ cái.


Lý do cho điều đó nằm trong tài liệu Hãy xem kỹ các tên không đổi. Bạn chỉ có thể kết hợp một lớp với một biến thể và một cờ. Thích TYPE_CLASS_NUMBER | TYPE_NUMBER_FLAG_SIGNED. Nhưng bạn không bao giờ có thể kết hợp các lớp học như numbertext
OneWorld

tài liệu chắc chắn không nói rằng không thể trộn lẫn các lớp. không có lint kiểm tra phàn nàn về nó. và thậm chí có một bàn phím cụ thể khi kết hợp ví dụ number|text(xem ở trên) ngụ ý rằng bạn có thể nhập các chữ cái bằng cách nhấn và giữ, không thực sự hoạt động. trông khá lỗi đối với tôi, hoặc ít nhất là không đầy đủ.
masc3d

@ masc3d - bác sĩ đồng ý không nói điều đó ở đâu. Được đề cập trong InputType , trong phần mô tả TYPE_MASK_CLASS: Mặt nạ các bit xác định lớp tổng thể của văn bản được đưa ra. các lớp được hỗ trợ là: TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_CLASS_PHONE, TYPE_CLASS_DATETIME. Tác giả IME: Nếu lớp học không phải là lớp bạn hiểu, hãy giả sử TYPE_CLASS_TEXT không có biến thể hoặc cờ. "
ToolmakerSteve

6

Về cơ bản, kiểu đầu vào EditText được sử dụng để đặt kiểu đầu vào trong EditText của bạn.

Các giá trị có thể có android:inputtypelà:

  • bản văn
  • textCapCharacters
  • textCapWords
  • textCapSentences
  • textAutoCorrect
  • textAutoComplete
  • textMultiLine
  • textImeMultiLine
  • textNoSuggestions
  • textUri
  • textEmailAddress
  • textEmailSubject
  • textShortMessage
  • textLongMessage
  • textPersonName
  • textPostalAddress
  • textPassword
  • textViblePassword
  • textWebEditText
  • textFilter
  • textPhonetic
  • con số
  • số đã ký
  • numberDecimal
  • điện thoại
  • ngày giờ
  • ngày
  • thời gian

thì bạn có thể sử dụng bất kỳ giá trị nào như hiển thị trong ví dụ:

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

3
Cảm ơn! Tôi thậm chí không thể tìm thấy tài liệu Google Android, liệt kê tất cả những điều này!
gimmegimme

4

Máy tính bảng của Asus có tính năng đó, họ đã tùy chỉnh bàn phím mặc định. Và bàn phím chỉ chứa các số và bảng chữ cái. Tôi nghĩ rằng giải pháp yêu cầu của bạn cũng là tùy chỉnh bàn phím mặc định


2

Bạn có thể theo dõi câu trả lời của Paresh Mayani.

Và theo lời khuyên, bạn có thể sử dụng android:inputType="textPhonetic"cho Văn bản và Số inputType dựa trên lựa chọn của người dùng.

Hy vọng bạn sẽ hiểu quan điểm của tôi.


2

Trong OnCreate trong Activity, hãy thực hiện điều này:

    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) {

        }
    });

Trong trường hợp này, bạn nhập là numbervà android sẽ hiển thị bàn phím số, nhưng bạn có thể nhập bất cứ thứ gì bạn muốn. Ngoài ra, bạn có thể ghi đè các phương thức khác như bạn muốn.


Bạn đã thử nó ở chế độ ngang, khi bàn phím ở chế độ toàn màn hình?
OneWorld

2

Đây là cách tôi đạt được nó ...

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

Chỉ các ký tự được chỉ định bởi các chữ số mới được phép.

Xin lưu ý rằng bàn phím hiển thị là bàn phím của trình quay số, không phải bàn phím thông thường. Đối với tôi, nó đã đạt được những gì tôi cần hoàn toàn trong XML.


1
Không trộn lẫn các lớp đầu vào. Chúng luôn luôn dẫn đến số lượng. Xem stackoverflow.com/questions/3544214/…
OneWorld

Cảm ơn slamn, tôi cần thiết để sử dụng chỉ số nguyên và "-" / trừ điều hành
gimmegimme

2

Bạn không nên sử dụng bất kỳ bộ lọc inputType nào trong trường hợp này, chỉ cần thêm dòng bên dưới vào Thuộc tính EditText của bạn

android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "

Giờ đây, chỉ những ký tự này mới được phép nhập vào EditText. Mã hoàn chỉnh của văn bản chỉnh sửa của bạn sẽ như sau:

<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
Giải pháp hoàn hảo ! Cảm ơn bạn !
BSQ

1

Tại sao không chỉ có một nút bật tắt:

  • Đặt loại đầu vào để chỉ cho phép các giá trị số
  • Đặt kiểu nhập để cho phép sử dụng bàn phím QWERTY
  • Hoặc đặt các loại đầu vào khác (nếu cần)

Bằng cách đó, bạn có thể đặt bàn phím số thành mặc định, sau đó người dùng có thể thay đổi nó bằng cách nhấn một nút.


1

Điều này là không thể thực hiện được với các kiểu nhập Android mặc định hiện tại trên các điện thoại khác nhau.

Có nhiều cách hack có thể hoạt động trên một số bàn phím nhưng không hoạt động trên một số bàn phím khác , chẳng hạn như phương pháp phổ biến để đặt kiểu nhập thô thường được bao gồm trong các câu trả lời:

  • editText.setRawInputType(InputType.TYPE_CLASS_NUMBER)

Lời khuyên tốt nhất mà tôi có thể tìm thấy là sử dụng textPostalAddresskiểu đầu vào trong XML của bạn:

  • android:inputType="textPostalAddress"

Đáng tiếc là điều này không làm những gì chúng tôi muốn nó làm chưa , nhưng có lẽ nó sẽ trong tương lai . Ưu điểm duy nhất của việc này là thông tin meta trên hộp chỉnh sửa của bạn sẽ phản ánh những gì bạn dự định.


1

Theo chương trình, có thể thực hiện với một chút chỉnh sửa đối với quy trình thông thường. Đầu tiên, bạn phải đặt editText là:

editText.setInputType(InputType.TYPE_CLASS_NUMBER);

Sau đó, bạn phải lắng nghe keyevent. Khi nhấn nút, hãy đặt lại InputType thành InputType.TYPE_CLASS_TEXT. Điều này sẽ hoạt động như nó hoạt động cho tôi.

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

Bạn có thể thử cài đặt ---

editText.setRawInputType(Configuration.KEYBOARD_QWERTY);

để biết thêm mô tả


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

0

Trong mã của bạn cho textView, hãy xóa "văn bản" trong android: inputType.

Nó phải là,

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

Đây không phải là giải quyết vấn đề của anh ta. Anh ấy muốn cho phép các chữ cái và số bằng bàn phím số
OneWorld

0

Bạn có thể làm điều này theo chương trình:

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

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

setInputType (kiểu int) Đặt kiểu nội dung với một hằng số như được định nghĩa cho inputType.


0

Như Saurav nói, cách tốt nhất là thay đổi giữa Bàn phím QWERTY và Numeric Keyborad với một trình nghe đơn giản:

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

Tôi thử tất cả các phương pháp nhưng không hoàn hảo. Vì vậy, tôi có một ý tưởng khác. Hoạt động hoàn hảo cho tất cả các bàn phím.

 @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);
        }
    }
}

-2

Trong bố cục xml của bạn cho EditText, hãy thêm tham số này:

android:inputType="number|text"

Điều này sẽ cho phép người dùng nhập cả văn bản và số và chứa logic trong xml thay vì có mã trong hoạt động hoặc phân đoạn của bạn.


3
Không trộn lẫn các lớp đầu vào. Chúng luôn luôn dẫn đến số lượng. Xem stackoverflow.com/questions/3544214/…
OneWorld
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.