EditText із цифровою клавіатурою за замовчуванням, але дозволяючи алфавітні символи


83

У мене є поле EditText, і я хочу, щоб типовою клавіатурою, яка з’являється, коли вона вибрана, стала числовою клавіатурою, оскільки більшу частину часу користувачі будуть вводити цифри. Однак я хочу дозволити користувачам також вводити алфавітні символи, якщо це потрібно. Використання android:inputType="number"обмежує введення лише цифровими цифрами. Які у мене є варіанти?


2
Привіт, у вас є рішення? Якщо так, то, будь ласка, поділіться ним. Я повинен впровадити те саме
Bansal_Sneha

Ви хочете, щоб користувач починав лише з цифрового, а потім після більш ніж 1 цифри він / вона може дозволити вводити буквено-цифрові?
dhuma1981

це є відповідь тут
Рахул Тиварі

можливий дублікат. питання відповів в цьому аналогічний пост
hrk_er

Відповіді:


17

Визначте ваш EditText у вашому xml таким чином:

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

output: android: inputType = "textVisiblePassword"

Ряд цифр та решта букв.


3
Це має бути обрана відповідь!
Таш Пемхіва,

Це залежить від клавіатури. У моєму випадку не працює з останніми версіями клавіатури Google і Nougat.
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>

Якщо число є одним із типів вводу, а клавіатура перебуває в повноекранному режимі (альбомний), літери приховуються. При переході назад до типу TEXT inputType вони з’являються знову.
OneWorld

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 він показував цифрову клавіатуру, але не міг показати звичайну клавіатуру.
Роб

Виглядає багатообіцяючим, але якщо число є одним із типів вводу, а клавіатура перебуває в повноекранному режимі (альбомний), літери приховуються.
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. Але ви ніколи не можете змішувати такі заняття, як numberіtext
OneWorld

в документації точно не вказано, що класи не можна змішувати. немає жодної перевірки ворсу, яка б скаржилася і навіть є певна клавіатура при поєднанні, наприклад number|text(див. вище), що означає, що ви можете вводити літери довгим натисканням, насправді не працює. мені здається досить глючним, або принаймні неповним.
masc3d

@ masc3d - погоджений документ не говорить, що там, де слід. Згадується під InputType , в описі TYPE_MASK_CLASS: Маска бітів, що визначають загальний клас даного тексту. підтримувані класи: TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_CLASS_PHONE, TYPE_CLASS_DATETIME. Автори IME: Якщо клас не один ви розумієте, припустимо TYPE_CLASS_TEXT зі зміною NO або прапорів «.
ToolmakerSteve

6

В основному, тип вводу EditText використовується для встановлення типу введення у вашому EditText.

Можливі значення для android:inputtype:

  • текст
  • textCapCharacters
  • textCapWords
  • textCapSentences
  • textAutoCorrect
  • textAutoComplete
  • textMultiLine
  • textImeMultiLine
  • textNoSugestions
  • textUri
  • textEmailAddress
  • textEmailSubject
  • textShortMessage
  • textLongMessage
  • textPersonName
  • textPostalAddress
  • textPassword
  • textVisiblePassword
  • textWebEditText
  • textFilter
  • textFonetic
  • номер
  • номер Підписано
  • число Десяткове
  • телефон
  • дата, час
  • дата
  • час

тоді ви можете використовувати будь-яке значення, як показано в прикладі:

<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 має таку функцію, вони налаштували клавіатуру за замовчуванням. А клавіатура містить лише цифри та алфавіти. Я думаю, що ваше рішення щодо вимог занадто велике, щоб налаштувати клавіатуру за замовчуванням


2

Ви можете стежити за відповіддю Пареша Маяні.

І як пораду ви можете використовувати android:inputType="textPhonetic"для введенняТип тексту та номер на основі вибору користувача.

Сподіваюся, ви зрозумієте мою думку.


2

У OnCreate in Activity зробіть так:

    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

2

Ось як я цього досяг ...

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

Дозволені лише символи, вказані цифрами.

Зверніть увагу, що показана клавіатура набирача номера, а не типова клавіатура. Для мене це досягло того, що мені потрібно, повністю в XML.


1
Не змішуйте класи введення. Вони завжди приведуть до числа. Дивіться stackoverflow.com/questions/3544214/…
OneWorld

Дякую slamn, мені потрібно було використовувати лише цілі числа та оператор "-" / мінус
gimmegimme

2

У цьому випадку ви не повинні використовувати будь-який фільтр inputType, просто додайте нижченаведений рядок у властивість EditText

android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "

Тепер лише цим символам буде дозволено вводити текст 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

Програмно це можливо з невеликою кількістю налаштувань до звичайного потоку. Спочатку потрібно встановити 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;
              }
         }
     }
}  

1

Чому б просто не мати перемикач, який:

  • Встановлює тип введення для дозволу лише числових значень
  • Встановлює тип введення, щоб дозволити використання клавіатури QWERTY
  • Або встановіть інші типи введення (за потреби)

Таким чином, ви можете встановити цифрову клавіатуру за замовчуванням, тоді користувач може змінити її, натиснувши кнопку.


1

Це неможливо, враховуючи поточні типи вводу Android за замовчуванням на різних телефонах.

Існує багато можливих злому, які працюють на одних клавіатурах, але не на інших , як загальний метод встановлення вихідного типу введення, який зазвичай міститься у відповідях:

  • editText.setRawInputType(InputType.TYPE_CLASS_NUMBER)

Найкраща порада, яку я міг знайти, - це використовувати textPostalAddressтип введення у вашому XML:

  • android:inputType="textPostalAddress"

На жаль , це не те , що ми хочемо зробити ще , але , можливо , це буде в майбутньому . Єдина перевага цього полягає в тому, що метаінформація у вашому полі редагування відображатиме те, що ви плануєте.



0

У коді для textView видаліть текст у android: inputType.

Вона повинна бути,

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

Це не вирішує його проблеми. Він хоче дозволити літери та цифри за допомогою
цифрової

0

Ви можете зробити це програмно:

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

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

setInputType (тип int) Встановіть тип вмісту з константою, як визначено для inputType.


0

Як каже Саурав, найкращим способом є перехід між клавіатурою 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);
        }
    }
}

-2

У своєму макеті xml для EditText додайте цей параметр:

android:inputType="number|text"

Це дозволить користувачеві вводити як текст, так і число та містить логіку в xml, а не мати код у вашій діяльності чи фрагменті.


3
Не змішуйте класи введення. Вони завжди приведуть до числа. Дивіться stackoverflow.com/questions/3544214/…
OneWorld
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.