Mam pole EditText i chcę, aby domyślna klawiatura pojawiła się, gdy zostanie wybrana jako klawiatura numeryczna, ponieważ przez większość czasu użytkownicy będą wprowadzać liczby. Chciałbym jednak umożliwić użytkownikom wprowadzanie znaków alfabetu, jeśli zajdzie taka potrzeba. Użycie android:inputType="number"
ogranicza wprowadzanie tylko do cyfr numerycznych. Jakie mam opcje?
android
android-keypad
Frank Bozzo
źródło
źródło
Odpowiedzi:
Zdefiniuj EditText w swoim xml w ten sposób:
<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"/>
wynik: android: inputType = "textVisiblePassword"
Rząd cyfr i reszta liter.
źródło
Sugerowałbym bardziej solidne rozwiązanie:
Przedstaw użytkownikowi możliwość wyboru typu wejścia:
POTRZEBNE POPRAWKI
- lepsza obsługa pokazywania / ukrywania przycisków wyboru wejścia
- prawdopodobnie usuń sugestie, gdy typ wejścia to litera
Oto aktywność:
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); } }
Oto plik XML działania:
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>
źródło
Oto, czego szukasz:
Zdefiniuj
EditText
w swoim xml w ten sposób:<EditText android:id="@+id/etTest" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="@string/hint"> </EditText>
I zadzwoń po
onCreate()
:etTest = (EditText) findViewById(R.id.etTest); etTest.setRawInputType(InputType.TYPE_CLASS_NUMBER); // Note the "Raw"
Za każdym razem, gdy klikniesz na
EditText
teraz, możesz wprowadzić cyfry ORAZ litery ! (Klawiatura cyfrowa jest wyświetlana jako pierwsza)źródło
Niestety nie jest to możliwe, ponieważ dla EditText można ustawić tylko jeden inputType. Poniższe pokaże tylko znaki alfabetu na przyciskach.
<EditText android:id="@+id/editText1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="text|number" />
Mogę jednak zasugerować, że ustaw typ wprowadzania danych na numeryczny i po prostu dodaj mały przycisk switchKeyboard do formularza w pobliżu klawiatury numerycznej. I ustaw jego onClick
editText1.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
dzięki czemu użytkownicy mogą również przełączać się na znaki alfabetyczne.
źródło
TYPE_CLASS_NUMBER | TYPE_NUMBER_FLAG_SIGNED
. Ale nigdy nie możesz mieszać zajęć takich jaknumber
itext
number|text
(patrz wyżej), która oznacza, że można wprowadzać litery przez długie naciśnięcie, w rzeczywistości nie działa. wydaje mi się raczej wadliwy, a przynajmniej niekompletny.TYPE_MASK_CLASS
: Maska bitów określająca ogólną klasę podawanego tekstu. obsługiwane klasy to: TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_CLASS_PHONE, TYPE_CLASS_DATETIME. Autorzy IME: jeśli klasa nie jest tą, którą rozumiesz, załóż, że TYPE_CLASS_TEXT bez zmian ani flag. ”Zasadniczo typ wejściowy EditText służy do ustawiania typu wejściowego w EditText.
Możliwe wartości
android:inputtype
to:wtedy możesz użyć dowolnej wartości, jak pokazano na przykładzie:
<EditText android:id="@+id/EditText01" android:layout_height="wrap_content" android:layout_width="fill_parent" android:inputType="number" android:text="1212223"/>
źródło
Tablet Asus ma tę funkcję, dostosował domyślną klawiaturę. A klawiatura zawiera tylko cyfry i alfabety. Myślę, że twoim rozwiązaniem wymagań jest również dostosowanie domyślnej klawiatury
źródło
Możesz śledzić odpowiedź Paresh Mayani.
android:inputType="textPhonetic"
Radzimy, że możesz użyć tekstu i numeru inputType w zależności od wyboru użytkownika.Mam nadzieję, że zrozumiesz mój punkt widzenia.
źródło
W OnCreate in Activity wykonaj następujące czynności:
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) { } });
W tym przypadku wpiszesz to,
number
a system Android pokaże klawiaturę numeryczną, ale możesz wpisać, co chcesz. Możesz także zastąpić inne metody, jak chcesz.źródło
Oto jak to osiągnąłem ...
android: inputType = "textPhonetic | numberDecimal" android: digits = "/ 0123456789.abcdefghijklmnopqrstuvwxyz"
Dozwolone będą tylko znaki określone cyframi.
Należy pamiętać, że pokazana klawiatura jest klawiaturą dialera, a nie typową klawiaturą. Dla mnie osiągnęło to, czego potrzebowałem, całkowicie w XML.
źródło
W tym przypadku nie powinieneś używać żadnego filtra inputType, po prostu dodaj poniższy wiersz we właściwości EditText
android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "
Teraz tylko te znaki będą mogły wejść w EditText. Kompletny kod twojego edittext będzie wyglądał następująco:
<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">
źródło
Programowo jest to możliwe przy niewielkim dostosowaniu do zwykłego przepływu. Najpierw musisz ustawić editText jako:
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
Następnie musisz nasłuchiwać keyevent. Po naciśnięciu funta ustaw InputType ponownie na InputType.TYPE_CLASS_TEXT. To powinno działać tak, jak działa dla mnie.
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; } } } }
źródło
Dlaczego nie mieć po prostu przycisku przełączania, który:
W ten sposób można ustawić klawiaturę numeryczną jako domyślną, a następnie użytkownik może ją zmienić, naciskając przycisk.
źródło
To jest niemożliwe biorąc pod uwagę obecne domyślne typy wejściowe systemu Android w różnych telefonach.
Istnieje wiele możliwych hacków, które działają na niektórych klawiaturach, ale nie na innych , na przykład powszechna metoda ustawiania surowego typu danych wejściowych, która jest często uwzględniana w odpowiedziach:
editText.setRawInputType(InputType.TYPE_CLASS_NUMBER)
Najlepsza rada, jaką mogłem znaleźć, to użycie
textPostalAddress
typu wejściowego w twoim XML:android:inputType="textPostalAddress"
Niestety to nie to, co chcemy zrobić jeszcze , ale może będzie to w przyszłości . Jedyną zaletą tego jest to, że metainformacje w polu edycji będą odzwierciedlać to, co zamierzasz.
źródło
Możesz spróbować ustawić ---
editText.setRawInputType(Configuration.KEYBOARD_QWERTY);
aby uzyskać więcej informacji
źródło
W kodzie textView usuń „tekst” w android: inputType.
Powinno być,
<EditText android:id="@+id/editText1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="number" />
źródło
Możesz to zrobić programowo:
// Numbers mEditText.setInputType(InputType.TYPE_CLASS_NUMBER); // Text mEditText.setInputType(InputType.TYPE_CLASS_TEXT);
źródło
Jak mówi Saurav, najlepszym sposobem jest przełączanie się między klawiaturą QWERTY a klawiaturą numeryczną za pomocą prostego słuchacza:
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; } });
źródło
Próbuję wszystkich metod, ale nie są one doskonałe. Mam więc inny pomysł. Działa idealnie dla wszystkich klawiatur.
@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); } } }
źródło
W swoim układzie XML dla EditText dodaj ten parametr:
android:inputType="number|text"
Pozwoli to użytkownikowi wprowadzić zarówno tekst, jak i liczbę i będzie zawierać logikę w xml zamiast mieć kod w Twojej aktywności lub fragmencie.
źródło