EditText с цифровой клавиатурой по умолчанию, но с возможностью использования буквенных символов

83

У меня есть поле EditText, и мне нужна клавиатура по умолчанию, которая появляется, когда она выбрана как цифровая клавиатура, поскольку большую часть времени пользователи будут вводить числа. Однако я хочу разрешить пользователям вводить буквенные символы, если им нужно. Использование android:inputType="number"ограничивает ввод только числовыми цифрами. Какие у меня есть варианты?

Фрэнк Боззо
источник
2
Привет, у вас есть решение? Если да, то, пожалуйста, поделитесь им. Я должен реализовать то же самое
Bansal_Sneha
Вы хотите, чтобы пользователь начинал только с цифры, а затем после более чем одной цифры он / она мог разрешить вводить буквенно-цифровые?
dhuma1981 05
это есть ответ здесь
Рахул Тивари
возможный дубликат.
Ответ на

Ответы:

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

вывод: android: inputType = "textVisiblePassword"

Ряд цифр и остальные буквы.

Диего Сантамария
источник
3
Это должен быть выбранный ответ!
Таш Пемхива
Это зависит от клавиатуры. В моем случае не работает с последними версиями Google Keyboard и Nougat.
fireb86
Вы
Эшвин С. Ашок
this._editText.setInputType (InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); this._editText.setTypeface (Typeface.DEFAULT); у меня работает
xevser 05
@ 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>
Шериф Эль-Хатиб
источник
Если number является одним из inputTypes и клавиатура находится в полноэкранном режиме (альбомная ориентация), буквы скрываются. При переключении обратно на 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 была показана цифровая клавиатура, но не было возможности показать обычную клавиатуру.
Роб
Выглядело многообещающе, но если number является одним из inputTypes, а клавиатура находится в полноэкранном режиме (альбомная ориентация), буквы будут скрыты.
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
  • textNoSuggestions
  • textUri
  • textEmailAddress
  • textEmailSubject
  • textShortMessage
  • textLongMessage
  • textPersonName
  • textPostalAddress
  • textPassword
  • textVisiblePassword
  • textWebEditText
  • textFilter
  • textPhonetic
  • количество
  • numberSigned
  • numberDecimal
  • Телефон
  • дата и время
  • свидание
  • время

тогда вы можете использовать любое значение, как показано в примере:

<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

Вы можете следить за ответом Пареша Майани.

И в advice вы можете использовать android:inputType="textPhonetic"для inputType Text и Number в зависимости от выбора пользователя.

Надеюсь, вы поняли мою точку зрения.

Шреяш Махаджан
источник
2

В OnCreate в 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 будет таким:

<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
  • Или установите другие типы ввода (при необходимости)

Таким образом, вы можете установить цифровую клавиатуру по умолчанию, а затем пользователь может изменить ее, нажав кнопку.

Dabaerju
источник
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" />
Г-жа Б.
источник
Это не решает его проблемы. Он хочет разрешить использование букв и цифр на цифровой клавиатуре
OneWorld
0

Вы можете сделать это программно:

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

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

setInputType (int type) Установите тип содержимого с константой, как определено для inputType.

jmcdonnell40
источник
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