EdytujTekst z klawiaturą numeryczną domyślnie, ale dopuszcza znaki alfabetyczne

83

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?

Frank Bozzo
źródło
2
Cześć, czy masz rozwiązanie? Jeśli tak, to udostępnij je. Muszę wdrożyć to samo
Bansal_Sneha
Czy chcesz, aby użytkownik zaczynał tylko od liczb, a następnie po więcej niż 1 cyfrze może pozwolić na wpisanie alfanumeryczne?
dhuma1981,
tutaj
Rahul Tiwari
możliwy duplikat. na pytanie odpowiedział ten podobny post
hrk_er

Odpowiedzi:

17

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.

Diego Santamaria
źródło
3
To powinna być wybrana odpowiedź!
Tash Pemhiwa
To zależy od klawiatury. W moim przypadku nie działa z ostatnimi wersjami Google Keyboard i Nougat.
fireb86
Czy naprawiłeś problem
Ashwin S Ashok
this._editText.setInputType (InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); this._editText.setTypeface (Typeface.DEFAULT); działa dla mnie
xevser
@ fireb86 działa z najnowszą wersją Gboard. I działa doskonale na Oreo.
Tim John,
11

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

wprowadź opis obrazu tutaj

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>
Sherif elKhatib
źródło
Jeśli jednym z typów inputType jest liczba, a klawiatura jest w trybie pełnoekranowym (poziomym), litery są ukrywane. Po przełączeniu z powrotem do TEXT inputType, pojawiają się one ponownie.
OneWorld
10

Oto, czego szukasz:

Zdefiniuj EditTextw 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 EditTextteraz, możesz wprowadzić cyfry ORAZ litery ! (Klawiatura cyfrowa jest wyświetlana jako pierwsza)

Terel
źródło
3
Dla mnie na Nexusie 7 pokazywał klawiaturę numeryczną, ale nie miał możliwości pokazania normalnej klawiatury.
Rob
Wyglądało obiecująco, ale jeśli liczba jest jednym z typów inputType, a klawiatura jest w trybie pełnoekranowym (poziomo), litery są ukrywane.
OneWorld
8

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.

Alpay
źródło
Przyczyna tego leży w dokumentacji Przyjrzyj się bliżej nazwom stałym. Możesz połączyć tylko jedną klasę z jedną odmianą i jedną flagą. Lubię TYPE_CLASS_NUMBER | TYPE_NUMBER_FLAG_SIGNED. Ale nigdy nie możesz mieszać zajęć takich jak numberitext
OneWorld
dokumentacja z pewnością nie stwierdza, że ​​nie można mieszać klas. nie ma na to kontroli kłaczków. i istnieje nawet specjalna klawiatura podczas łączenia, np. 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.
masc3d
@ masc3d - uzgodniony dokument nie mówi, że powinien. Jest wspomniany pod InputType , w opisie 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. ”
ToolmakerSteve,
6

Zasadniczo typ wejściowy EditText służy do ustawiania typu wejściowego w EditText.

Możliwe wartości android:inputtypeto:

  • tekst
  • textCapCharacters
  • textCapWords
  • textCapSentences
  • textAutoCorrect
  • textAutoComplete
  • textMultiLine
  • textImeMultiLine
  • textNoSuggestions
  • textUri
  • textEmailAddress
  • textEmailSubject
  • textShortMessage
  • textLongMessage
  • textPersonName
  • textPostalAddress
  • textPassword
  • textVisiblePassword
  • textWebEditText
  • textFilter
  • textPhonetic
  • numer
  • numberSigned
  • numberDecimal
  • telefon
  • datetime
  • data
  • czas

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"/>
Paresh Mayani
źródło
3
Dzięki! Nie mogłem nawet znaleźć dokumentacji Google Android, wymieniającej to wszystko!
gimmegimme
4

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

Shaista Naaz
źródło
2

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.

Shreyash Mahajan
źródło
2

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, numbera system Android pokaże klawiaturę numeryczną, ale możesz wpisać, co chcesz. Możesz także zastąpić inne metody, jak chcesz.

dilix
źródło
Czy próbowałeś tego w trybie poziomym, gdy klawiatura jest w trybie pełnoekranowym?
OneWorld
2

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.

slaman
źródło
1
Nie mieszaj klas wejściowych. Zawsze skutkują liczbą. Zobacz stackoverflow.com/questions/3544214/…
OneWorld
Dzięki slamn, potrzebowałem użyć tylko liczb całkowitych i operatora „-” / minus
gimmegimme
2

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

Naveed Ahmad
źródło
1
Idealne rozwiązanie! Dziękuję Ci !
BSQ
2

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;
              }
         }
     }
}  
Saurav
źródło
1

Dlaczego nie mieć po prostu przycisku przełączania, który:

  • Ustawia typ danych wejściowych, aby zezwalać tylko na wartości liczbowe
  • Ustawia typ wejścia, aby umożliwić używanie klawiatury QWERTY
  • Lub ustaw inne typy wejść (w razie potrzeby)

W ten sposób można ustawić klawiaturę numeryczną jako domyślną, a następnie użytkownik może ją zmienić, naciskając przycisk.

dabaerju
źródło
1

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 textPostalAddresstypu 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.

Richard Le Mesurier
źródło
0

Możesz spróbować ustawić ---

editText.setRawInputType(Configuration.KEYBOARD_QWERTY);

aby uzyskać więcej informacji

Swati
źródło
1
Configuration.KEYBOARD_QWERTY == InputType.TYPE_CLASS_NUMBER == 2
Enyby
0

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" />
Pani B.
źródło
To nie rozwiązuje jego problemu. Chce zezwolić na litery i cyfry z klawiaturą numeryczną
OneWorld
0

Możesz to zrobić programowo:

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

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

setInputType (int type) Ustaw typ zawartości za pomocą stałej zdefiniowanej dla inputType.

jmcdonnell40
źródło
0

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;
    }
});
oskarko
źródło
0

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);
        }
    }
}
Rico Teng
źródło
-2

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.

Sam Bains
źródło
3
Nie mieszaj klas wejściowych. Zawsze skutkują liczbą. Zobacz stackoverflow.com/questions/3544214/…
OneWorld