Setel EditText Digit secara terprogram

89

Saya pada dasarnya mencoba untuk mengatur nilai digit dari EditText secara terprogram. Sejauh ini saya memiliki:

weightInput.setInputType(InputType.TYPE_CLASS_PHONE);
weightInput.setKeyListener(DigitsKeyListener.getInstance());

Tidak masalah, tetapi saya juga ingin memasukkan tempat desimal (.). Ada ide?

ryandlf.dll
sumber
1
Anda mungkin lebih suka menggunakan DialerKeyListenerdaripadaDigitsKeyListener
Dmitry Gryazin

Jawaban:

208

Coba ini:

<EditText
    android:inputType="number"
    android:digits="0123456789."
/>

Dari Kode:

weightInput.setKeyListener(DigitsKeyListener.getInstance("0123456789."));

Tapi, ini memungkinkan pengguna untuk memasukkan beberapa "." Lihat jawaban JoeyRA untuk bilangan real.

Whiler
sumber
Tidak apa-apa, tapi saya ingin melakukan ini secara terprogram. Alasan untuk ini adalah karena saya ingin menggunakan kembali satu tata letak dalam banyak situasi karena angka ini adalah satu-satunya variabel yang berubah terus-menerus. Melakukannya dalam kode jauh lebih efektif dalam situasi saya.
ryandlf
2
Terima kasih. Saya sebenarnya merasa jawaban ini layak mendapat tanda centang karena khusus untuk apa yang saya minta, tetapi kedua solusi tersebut berfungsi.
ryandlf
@feresr, itu aneh, karena melihat TextViewsumber: // If no input type was specified, we will default to generic text, since we can't tell the IME about the set of digits that was selected.
Dmitry Gryazin
Apa gunanya .setelah jam 9?
Mitesh Shah
1
@IteshShah memungkinkan tempat desimal.
masterwok
30

Coba ini:

weightInput.setInputType(InputType.TYPE_CLASS_NUMBER);          
weightInput.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);           
weightInput.setKeyListener(DigitsKeyListener.getInstance(false,true));

public static DigitsKeyListener getInstance (boolean sign, boolean decimal) 

Mengembalikan DigitsKeyListener yang menerima angka 0 sampai 9, ditambah tanda minus (hanya di awal) dan / atau titik desimal (hanya satu per bidang) jika ditentukan.

Ini memecahkan masalah tentang banyak '.' di EditText

JoeyRA
sumber
1
Cukup tambahkan klarifikasi: editText.setKeyListener (DigitsKeyListener.getInstance (true, true)); untuk mengaktifkan desimal dan angka negatif. editText.setKeyListener (DigitsKeyListener.getInstance (false, true)); untuk mengaktifkan hanya angka desimal positif. editText.setKeyListener (DigitsKeyListener.getInstance (false, false)); untuk mengaktifkan hanya bilangan bulat positif.
SerSánGal
8
Pertanyaan: Jika Anda setInputTypesekali dan lagi, bukankah itu akan menimpa yang kedua ke yang pertama? Saya pikir Anda harus menggunakan weightInput.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);tetapi saya tidak 100% yakin
Rafael Ruiz Muñoz
20

Gunakan InputType.TYPE_NUMBER_FLAG_DECIMAL.

Lihat juga: Jenis Input .

Ricky
sumber
-1? Saya pasti tidak melakukan itu. Solusi Anda berhasil, terima kasih.
ryandlf
Sepertinya itu telah dikembalikan. Senang untuk membantu.
Ricky
4

Untuk masukan alamat IP (Beberapa titik dan angka)

mencoba

<EditText
    android:id="@+id/ipBox"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/ipAddrHint"
    android:inputType="numberDecimal|number"
    android:digits="0123456789."
    android:textSize="30sp" />
NAGESH MH
sumber
1
Harap dicatat bahwa alamat IP heksadesimal (dengan bagian yang dimulai dengan 0x) juga valid, dan nama domain dapat digunakan sebagai pengganti alamat IP.
Triang3l
0

jika ada yang masih menemukan cara yang tepat, perhatikan bahwa setRawInputType()tidaksetInputType()

val digits = "ABCDabcd" // or any characters you want to allow
editText.keyListener = DigitsKeyListener.getInstance(digits) 
editText.setRawInputType(InputType.TYPE_TEXT_VARIATION_PERSON_NAME)
Asad
sumber