Metin düzenleme varsayılan olarak sayı tuş takımı ile, ancak alfabetik karakterlere izin verilir


83

Bir Metin Düzenleme kutum var ve kullanıcıların çoğu sayı gireceği için sayısal tuş takımı olarak seçildiğinde ortaya çıkan varsayılan klavyenin olmasını istiyorum . Ancak, gerektiğinde kullanıcıların alfabetik karakterleri de girmelerine izin vermek istiyorum. Kullanımı, android:inputType="number"girişi yalnızca sayısal rakamlarla sınırlar. Hangi seçeneklere sahibim?


2
Merhaba, çözümünüz var mı? Cevabınız evet ise lütfen paylaşın
Aynısını

Kullanıcının sadece sayısal ile başlamasını ve daha sonra 1 basamaktan sonra alfanümerik girmesine izin vermesini mi istiyorsunuz?
dhuma1981

bunun bir cevabı burada
Rahul Tiwari

olası kopya. soru bu Benzer
Gönderide

Yanıtlar:


17

EditText'inizi xml'nizde şu şekilde tanımlayın:

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

Bir satır sayı ve kalan harf.


3
Bu seçilen cevap olmalı!
Tash Pemhiwa

Klavyeye bağlıdır. Benim durumumda Google Klavye ve Nougat'ın son sürümleriyle çalışmıyor.
fireb86

Sorunu düzelttiniz mi
Ashwin S Ashok

this._editText.setInputType (InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); this._editText.setTypeface (Typeface.DEFAULT); benim için çalışıyor
xevser

@ fireb86 Gboard'un en son sürümüyle çalışır. Ve Oreo'da mükemmel çalışıyor.
Tim John

11

Daha sağlam bir çözüm öneririm:

Kullanıcıya giriş türünü seçme olanağı sunun:

GEREKLİ DÜZELTMELER

- giriş seçimi düğmelerinin daha iyi gösterilmesi / gizlenmesi

- muhtemelen giriş türü harf olduğunda önerileri kaldırın

görüntü açıklamasını buraya girin

İşte etkinlik:

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

}

İşte etkinliğin xml'si: 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>

Sayı inputType'lardan biriyse ve klavye tam ekran modundaysa (yatay), harfler gizlenir. TEXT inputType'a geri dönerken, tekrar görünürler.
OneWorld

10

İşte aradığınız şey:

EditTextXml'nizde şu şekilde tanımlayın :

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

</EditText>

Ve aşağıdakileri arayın onCreate():

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

EditTextŞimdi ne zaman tıklarsanız , rakamlar VE harfler girebilirsiniz ! (Önce rakam klavyesi gösterilir)


3
Bir Nexus 7'de benim için sayısal tuş takımını gösterdi, ancak normal klavyeyi gösterme yolu yoktu.
Rob

Umut verici görünüyordu, ancak sayı inputType'lardan biriyse ve klavye tam ekran modundaysa (yatay), harfler gizlenir.
OneWorld

8

Ne yazık ki bu mümkün değildir, çünkü bir EditText için yalnızca bir inputType ayarlanabilir. Aşağıdakiler sadece düğmelerdeki alfabetik karakterleri gösterecektir.

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

Bununla birlikte, size önerebileceğim şey, giriş türünüzü sayısal olarak ayarlayın ve formunuza sayısal tuş takımına yakın küçük bir anahtarKeyboard düğmesi ekleyin. Ve onClick'i ayarlayın

editText1.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

böylece kullanıcılar da alfabetik karakterlere geçebilir.


Bunun nedeni dokümantasyonda yatıyor Sabit isimlere yakından bakın. Yalnızca bir sınıfı bir varyasyon ve bir bayrakla birleştirebilirsiniz. Beğen TYPE_CLASS_NUMBER | TYPE_NUMBER_FLAG_SIGNED. Ama asla numberve gibi sınıfları karıştıramazsınıztext
OneWorld

belgeler kesinlikle sınıfların karıştırılamayacağını belirtmiyor. bundan şikayetçi hiçbir tiftik kontrolü yok. ve birleştirirken, örneğin number|text(yukarıya bakın), uzun basışla harfleri girebileceğiniz anlamına gelen, aslında çalışmayan belirli bir klavye bile vardır . Bana oldukça hatalı veya en azından eksik görünüyor.
masc3d

@ masc3d - kabul edilen doktor nerede olması gerektiğini söylemiyor. Aşağıdaki açıklamada InputType altında bahsedilir TYPE_MASK_CLASS: Verilen metnin genel sınıfını belirleyen bit maskesi. desteklenen sınıflar şunlardır: TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_CLASS_PHONE, TYPE_CLASS_DATETIME. IME yazarlar: Sınıf anlamak biri değilse, HAYIR varyasyon veya bayraklarla TYPE_CLASS_TEXT varsayalım ".
ToolmakerSteve

6

Temel olarak, EditText girdi türü EditText'inizdeki girdi türünü ayarlamak için kullanılır .

Olası değerler android:inputtypeşunlardır:

  • Metin
  • textCapCharacters
  • textCapWords
  • textCapSentences
  • textAutoCorrect
  • textAutoComplete
  • textMultiLine
  • textImeMultiLine
  • textNoSuggestions
  • textUri
  • textEmailAddress
  • textEmailSubject
  • textShortMessage
  • textLongMessage
  • textPersonName
  • textPostalAddress
  • textPassword
  • textVisiblePassword
  • textWebEditText
  • textFilter
  • textPhonetic
  • numara
  • numberSigned
  • sayıOndalık
  • telefon
  • tarih saat
  • tarih
  • zaman

o zaman herhangi bir değeri örnekte gösterildiği gibi kullanabilirsiniz:

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

3
Teşekkürler! Tüm bunları listeleyen Google Android belgelerini bile bulamadım!
gimmegimme

4

Asus tablet bu özelliğe sahip, varsayılan klavyeyi özelleştirdiler. Klavye yalnızca sayıları ve alfabeleri içerir. Sanırım ihtiyaç çözümünüz varsayılan klavyeyi özelleştirmek için çok fazla


2

Paresh Mayani cevabını takip edebilirsiniz.

Ve tavsiye olarak android:inputType="textPhonetic", kullanıcı seçimine bağlı olarak inputType Metin ve Numara için kullanabilirsiniz .

Umarım demek istediğimi anlarsın.


2

OnCreate in Activity'de şunu yapın:

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

        }
    });

Bu durumda numberyazarsınız ve android sayısal klavye gösterecektir, ancak istediğinizi girebilirsiniz. Ayrıca diğer yöntemleri istediğiniz gibi geçersiz kılabilirsiniz.


Klavye tam ekran modundayken yatayda denediniz mi?
OneWorld

2

İşte bunu nasıl başardım ...

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

Yalnızca rakamlarla belirtilen karakterlere izin verilecektir.

Lütfen gösterilen klavyenin çeviriciye ait olduğunu, tipik klavye olmadığını unutmayın. Benim için ihtiyacım olan şeyi tamamen XML içinde başardı.


1
Giriş sınıflarını karıştırmayın. Her zaman sayı ile sonuçlanırlar. Stackoverflow.com/questions/3544214/… sayfasına
OneWorld

Teşekkürler slamn, sadece tam sayıları ve "-" / eksi operatörünü kullanmam gerekiyordu
gimmegimme

2

Bu durumda herhangi bir inputType filtresi kullanmamalısınız, sadece aşağıdaki satırı EditText Özelliğinize ekleyin

android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "

Şimdi sadece bu karakterlerin EditText'e girmesine izin verilecek. Edittext'inizin tam kodu şöyle olacaktır:

<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
Mükemmel çözüm ! Teşekkür ederim !
BSQ

2

Programlı olarak, normal akışta küçük bir değişiklik ile mümkündür. Önce editText'i şu şekilde ayarlamanız gerekir:

editText.setInputType(InputType.TYPE_CLASS_NUMBER);

O zaman önemli olayları dinlemelisin. Pound'a basıldığında InputType'ı tekrar InputType.TYPE_CLASS_TEXT olarak ayarlayın. Bu benim için çalıştığı gibi çalışmalı.

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

Neden aşağıdakilerden birini yapan bir geçiş düğmesine sahip olmuyorsunuz:

  • Giriş türünü yalnızca sayısal değerlere izin verecek şekilde ayarlar
  • QWERTY klavyenin kullanımına izin vermek için giriş türünü ayarlar
  • Veya diğer giriş türlerini ayarlayın (gerekirse)

Bu şekilde, sayısal tuş takımını varsayılana ayarlayabilir ve ardından kullanıcı bir düğmeye basarak bunu değiştirebilir.


1

Çeşitli telefonlarda mevcut varsayılan Android giriş türleri göz önüne alındığında bu mümkün değildir .

Genellikle yanıtlara dahil edilen ham giriş türünü ayarlamanın yaygın yöntemi gibi, bazı klavyelerde çalışan ancak diğerlerinde işe yaramayan birçok olası hack vardır :

  • editText.setRawInputType(InputType.TYPE_CLASS_NUMBER)

Bulabildiğim en iyi tavsiye, textPostalAddressXML'nizdeki giriş türünü kullanmaktır :

  • android:inputType="textPostalAddress"

Ne yazık ki bu biz ne yapmak istediğinizi yapmaz henüz ama belki ileride olacak . Bunun tek avantajı, düzenleme kutunuzdaki meta bilgilerin niyetlerinizi yansıtmasıdır.


0

Ayarlamayı deneyebilirsiniz ---

editText.setRawInputType(Configuration.KEYBOARD_QWERTY);

için daha fazla bilgi


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

0

TextView kodunuzda, android: inputType'taki "metni" kaldırın.

Olmalı,

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

Bu onun problemini çözmüyor. Rakam klavyesiyle harflere ve sayılara izin vermek istiyor
OneWorld

0

Bunu programlı olarak yapabilirsiniz:

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

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

setInputType (int type) inputType için tanımlandığı gibi sabit içerik türünü ayarlayın.


0

Saurav'ın dediği gibi, en iyi yol QWERTY Klavye ve Sayısal Keyborad arasında basit bir dinleyici ile geçiş yapmaktır:

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üm yöntemi deniyorum ama mükemmel değil. O yüzden başka bir fikrim var. Tüm klavyeler için mükemmel çalışır.

 @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

EditText için xml düzeninize şu parametreyi ekleyin:

android:inputType="number|text"

Bu, kullanıcının hem metin hem de sayı girmesine olanak tanır ve etkinliğinizde veya parçanızda kod bulundurmak yerine xml'de mantığı içerir.


3
Giriş sınıflarını karıştırmayın. Her zaman sayı ile sonuçlanırlar. Stackoverflow.com/questions/3544214/… sayfasına
OneWorld
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.