Saya ingin mendefinisikan nilai min dan maks untuk EditText
.
Misalnya: jika ada orang yang mencoba memasukkan nilai bulan di dalamnya, nilainya harus antara 1-12.
Saya dapat melakukannya dengan menggunakan TextWatcher
tetapi saya ingin tahu apakah ada cara lain untuk melakukannya di file layout atau di tempat lain.
Sunting: Saya tidak ingin membatasi jumlah karakter. Saya ingin membatasi nilainya. Misalnya, jika saya membatasi bulan dengan EditText
karakter ketika saya memasukkan 12 itu akan menerimanya tetapi jika saya memasukkan 22 itu tidak boleh menerimanya saat saya memasukkan.
android
android-edittext
mertaydin
sumber
sumber
Jawaban:
Pertama buat kelas ini:
Kemudian gunakan ini dari Aktivitas Anda:
Ini akan memungkinkan pengguna untuk memasukkan nilai dari 1 hingga 12 saja .
EDIT:
Atur edittext Anda dengan
android:inputType="number"
.Anda dapat menemukan detail lebih lanjut di https://www.techcompose.com/how-to-set-minimum-and-maximum-value-in-edittext-in-android-app-development/ .
Terima kasih.
sumber
source
akan menggantikan beberapa karakter dalamdest
. Saya pikir Anda harus mensimulasikan penggantian, dan mendapatkan hasil akhir, lalu, validasi.Ada kesalahan kecil dalam kode Pratik. Misalnya, jika nilai 10 dan Anda menambahkan 1 di awal untuk membuat 110, fungsi filter akan memperlakukan nilai baru sebagai 101.
Lihat di bawah untuk perbaikannya:
sumber
String replacement = source.subSequence(start, end).toString(); String newVal = dest.subSequence(0, dstart).toString() + replacement + dest.subSequence(dend, dest.length()).toString();
String newVal= dest.toString().substring(0, dstart) + source.toString().substring(start, end) + dest.toString().substring(dend, dest.toString().length());
, terlihat lebih bersih dan jernih.min==3
kemudian tidak mungkin untuk mengetikkan angka apa pun yang dimulai dengan 1 atau 2 (mis: 15, 23)Dari apa yang saya lihat tentang solusi @ Patrik dan penambahan @ Zac, kode yang diberikan masih memiliki masalah besar:
Jika
min==3
kemudian tidak mungkin untuk mengetik angka apa pun yang dimulai dengan 1 atau 2 (mis: 15, 23)Jika
min>=10
kemudian tidak mungkin untuk mengetik apa pun karena setiap angka harus dimulai dengan 1,2,3 ...Dalam pemahaman saya, kami tidak dapat mencapai batasan min-max dari
EditText
nilai suatu dengan penggunaan kelas yang sederhanaInputFilterMinMax
, setidaknya tidak untuk nilai min, karena ketika pengguna mengetikkan angka positif, nilainya bertambah dan kami dapat dengan mudah melakukan on-the-fly test untuk memeriksa apakah sudah mencapai batas atau keluar dari jangkauan dan memblokir entri yang tidak sesuai. Menguji nilai min adalah cerita yang berbeda karena kami tidak dapat memastikan apakah pengguna telah selesai mengetik atau tidak dan karena itu tidak dapat memutuskan apakah kami harus memblokir atau tidak.Ini bukan apa yang diminta OP tetapi untuk tujuan validasi saya telah dikombinasikan dalam solusi saya
InputFilter
untuk menguji nilai-nilai maks, denganOnFocusChangeListener
untuk menguji ulang nilai min ketikaEditText
kehilangan fokus dengan asumsi pengguna selesai mengetik dan itu seperti ini:Dan
OnFocusChangeListenerMin
Kemudian di Activity atur
InputFilterMax
danOnFocusChangeListenerMin
untukEditText
diperhatikan: Anda dapat 2 menit minimum dan maksimumonFocusChangeListener
.sumber
if(Integer.valueOf(val)<min){ //Notify user that the value is not good }
Anda dapat melakukan apa yang Anda inginkan di sana, beri tahu pengguna dan set EditText menjadi kosong, saya tidak tahu apakah ini menjawab pertanyaan AndaPerpanjangan jawaban Pratik dan Zac. Zac memperbaiki bug kecil milik Pratik dalam jawabannya. Tapi saya mencatat bahwa kode tidak mendukung nilai negatif, itu akan melempar NumberFormatException. Untuk memperbaikinya, dan biarkan MIN negatif, gunakan kode berikut.
Tambahkan baris ini (Tebal) di antara dua baris lainnya:
newVal = newVal.substring (0, dstart) + source.toString () + newVal.substring (dstart, newVal.length ());
jika (newVal.equalsIgnoreCase ("-") && min <0) mengembalikan nol;
input int = Integer.parseInt (newVal);
sumber
Jika Anda membutuhkan rentang dengan angka negatif seperti -90: 90, Anda dapat menggunakan solusi ini.
sumber
Saya memperluas kode @Pratik Sharmas untuk menggunakan objek BigDecimal alih-alih int sehingga dapat menerima angka yang lebih besar, dan memperhitungkan setiap pemformatan di EditText yang bukan angka (seperti pemformatan mata uang, misalnya spasi, koma, dan titik)
EDIT: perhatikan bahwa implementasi ini memiliki 2 sebagai angka signifikan minimum yang ditetapkan pada BigDecimal (lihat konstanta MIN_SIG_FIG) seperti yang saya gunakan untuk mata uang, jadi selalu ada 2 angka utama sebelum titik desimal. Ubah konstanta MIN_SIG_FIG seperlunya untuk implementasi Anda sendiri.
sumber
Saya menemukan jawaban saya sendiri. Sekarang sudah sangat terlambat, tetapi saya ingin membaginya dengan Anda. Saya mengimplementasikan antarmuka ini:
Dan kemudian implementasikan dengan cara ini di dalam aktivitas Anda:
Ini adalah jawaban yang sangat sederhana, jika ada yang lebih baik tolong beri tahu saya.
sumber
Ada yang salah dalam jawaban yang diterima.
Jika saya memindahkan kursor ke tengah teks, lalu mengetik sesuatu, maka pernyataan di atas akan menghasilkan hasil yang salah. Misalnya, ketik "12" pertama, lalu ketik "0" antara 1 dan 2, maka pernyataan yang disebutkan di atas akan menghasilkan "120", bukan 102. Saya mengubah pernyataan ini menjadi pernyataan di bawah ini:
sumber
Kotlin jika ada yang membutuhkannya (Gunakan Utilitas)
Kemudian gunakan ini dari kelas Kotlin Anda
EditText ini memungkinkan dari 1 hingga 100.
Kemudian gunakan ini dari XML Anda
sumber
Saya membuat cara yang lebih sederhana untuk mengatur min / max ke Edittext. Saya menggunakan keypad aritmatika dan saya bekerja dengan metode ini:
Metode ini menerima semua nilai Anda tetapi jika nilai pengguna tidak mematuhi batas Anda, maka akan ditetapkan secara otomatis ke batas min / maks. Misalnya batas limin = 10, limax = 80 jika pengguna menetapkan 8, secara otomatis 10 disimpan ke variabel dan EditTeks diatur ke 10.
sumber
Saya tahu sudah ada jutaan jawaban untuk ini, dengan satu jawaban diterima. Namun, ada banyak bug dalam jawaban yang diterima dan sebagian besar sisanya hanya memperbaiki satu (atau mungkin dua), tanpa memperluas ke semua kasus penggunaan yang mungkin.
Jadi pada dasarnya saya mengkompilasi sebagian besar perbaikan bug yang disarankan dalam jawaban dukungan serta menambahkan metode untuk memungkinkan input nomor yang terus menerus di luar rentang ke arah 0 (jika rentang tidak mulai dari 0), setidaknya sampai yakin bahwa itu tidak lagi berada dalam jangkauan. Karena harus jelas, ini adalah satu-satunya waktu yang benar-benar menyebabkan masalah dengan banyak solusi lain.
Inilah solusinya:
Perhatikan bahwa beberapa kasus input tidak mungkin untuk menangani "secara aktif" (yaitu, karena pengguna memasukkannya), jadi kita harus mengabaikannya dan menanganinya setelah pengguna selesai mengedit teks.
Begini cara Anda menggunakannya:
Sekarang, ketika pengguna mencoba mengetikkan angka lebih dekat ke 0 daripada rentang yang diizinkan, salah satu dari dua hal akan terjadi:
Jika
min
danmax
memiliki jumlah digit yang sama, mereka tidak akan diizinkan untuk memasukkannya sama sekali begitu mereka mencapai digit terakhir.Jika angka di luar rentang dibiarkan di bidang ketika teks kehilangan fokus, maka secara otomatis akan disesuaikan dengan batas terdekat.
Dan tentu saja, pengguna tidak akan pernah diizinkan untuk memasukkan nilai lebih jauh dari 0 daripada rentang memungkinkan, juga tidak mungkin untuk nomor seperti itu untuk "tidak sengaja" berada di bidang teks karena alasan ini.
Masalah Dikenal?)
EditText
kehilangan fokus ketika pengguna selesai dengan itu.Pilihan lain adalah membersihkan ketika pengguna menekan tombol "selesai" / kembali, tetapi dalam banyak atau bahkan kebanyakan kasus, ini menyebabkan kehilangan fokus.
Namun, menutup keyboard lunak tidak akan secara otomatis membatalkan fokus elemen. Saya yakin 99,99% pengembang Android menginginkannya (dan bahwa penanganan fokus pada
EditText
elemen kurang dari rawa pada umumnya), tetapi sampai saat ini belum ada fungsi bawaan untuk itu. Metode termudah yang saya temukan untuk mengatasi hal ini, jika perlu, adalah memperluasEditText
sesuatu seperti ini:Ini akan "mengelabui" filter untuk membersihkan input meskipun pandangan belum benar - benar kehilangan fokus. Jika pandangan terjadi kemudian kehilangan fokus sendiri, sanitasi input akan memicu lagi, tetapi tidak ada yang akan berubah karena sudah diperbaiki.
Penutupan
Wah. Itu banyak. Apa yang awalnya tampak seperti itu akan menjadi masalah yang cukup mudah dan berakhir dengan mengungkap banyak potongan vanilla Android yang jelek (setidaknya di Jawa). Dan sekali lagi, Anda hanya perlu menambahkan pendengar dan memperpanjang
EditText
jika rentang Anda tidak termasuk 0 dalam beberapa cara. (Dan secara realistis, jika rentang Anda tidak termasuk 0 tetapi mulai dari 1 atau -1, Anda juga tidak akan mengalami masalah.)Sebagai catatan terakhir, ini hanya berfungsi untuk int . Tentu saja ada cara untuk mengimplementasikannya agar bekerja dengan desimal (
double
,float
), tetapi karena saya maupun penanya semula tidak membutuhkan hal itu, saya tidak ingin terlalu mendalam. Akan sangat mudah untuk hanya menggunakan pemfilteran pasca-penyelesaian bersama dengan baris berikut:Anda hanya perlu mengubah dari
int
menjadifloat
(ataudouble
), mengizinkan penyisipan satu.
(atau,
, tergantung pada negara?), Dan parse sebagai salah satu tipe desimal alih-alih sebuahint
.Itu menangani sebagian besar pekerjaan, jadi itu akan bekerja sangat mirip.
sumber
sumber
Contoh yang sangat sederhana di Kotlin:
sumber
silakan periksa kode ini
GUNAKAN tautan di bawah ini untuk detail lebih lanjut tentang edittext dan filter edittext dengan pengamat teks ..
http://www.mobisoftinfotech.com/blog/android/android-edittext-setfilters-example-numeric-text-field-patterns-and-length-restriction/
sumber
Jika Anda hanya khawatir tentang batas maksimal maka tambahkan saja baris di bawah ini
Jika Anda perlu menambahkan batas minimum, maka Anda dapat melakukannya seperti ini dalam hal ini batas minimum adalah 7. pengguna dibatasi untuk memasukkan karakter antara batas minimum dan maksimum (antara 8 dan 10)
Jika Anda juga perlu membatasi pengguna untuk memasukkan 01 di awal kemudian memodifikasi jika kondisinya seperti ini
Pada metode panggilan akhir seperti
sumber
@Pratik Sharma
Untuk mendukung angka negatif , tambahkan kode berikut dalam metode filter :
Kemudian gunakan ini dari Aktivitas Anda:
Atur edittext Anda dengan:
sumber
// masih memiliki beberapa masalah tetapi Di sini Anda dapat menggunakan min, maks pada rentang apa pun (positif atau negatif)
sumber
Untuk menambah jawaban Pratik, berikut adalah versi yang dimodifikasi di mana pengguna dapat memasukkan min 2 digit juga, misalnya 15 hingga 100:
Semoga ini membantu. mohon jangan downvote tanpa alasan.
sumber
inilah cara yang saya gunakan, ini berfungsi untuk angka negatif
Pertama, buat kelas MinMaxFIlter.java dengan kode berikut:
Lalu, buat dan atur filter Anda ke edittext Anda seperti ini:
sumber
ini kode saya maks = 100, min = 0
xml
Jawa
sumber
Anda dapat melakukan ini dengan InputFilter. Tampaknya hanya ada Antarmuka Filter Input yang dapat Anda gunakan. Sebelum Anda melakukannya dengan cara yang mengganggu, buat Kelas baru yang memperluas filter Input, Anda dapat menggunakan pintasan ini dengan instantiasi Antarmuka kelas dalam.
Karena itu, lakukan saja ini:
Dalam contoh ini saya memeriksa apakah nilai EditText lebih besar dari 8. Jika tidak diatur ke 8. Jadi, Anda perlu membuat min max atau logika filter apa pun sendiri. Tetapi setidaknya Anda dapat menulis logika filter dengan cukup rapi dan pendek langsung ke EditText.
Semoga ini membantu
sumber
Untuk menentukan nilai minimum EditText, saya menggunakan ini:
sumber
@ Patrik kode punya ide bagus tapi dengan banyak bug. @Zac dan @Anthony B (solusi angka negatif) telah menyelesaikan beberapa di antaranya, tetapi kode @ Zac masih memiliki 3 bug utama:
1. Jika pengguna menghapus semua entri dalam EditText, tidak mungkin untuk mengetikkan angka apa pun lagi. Tentu saja ini dapat dikontrol menggunakan EditText yang diubah pendengar pada setiap bidang, tetapi itu akan menghapus keindahan menggunakan kelas InputFilter yang umum untuk masing-masing EditText di aplikasi Anda.
2. Apakah @ Guernee4 mengatakan, jika misalnya min = 3, tidak mungkin untuk mengetikkan angka yang dimulai dengan 1.
3. Jika misalnya min = 0, Anda dapat mengetik memiliki banyak nol yang Anda inginkan, sehingga hasilnya tidak elegan. Atau juga, jika berapapun nilainya min, pengguna dapat menempatkan kursor dalam ukuran kiri dari angka pertama, sebuah tempat sekelompok nol di depan ke kiri, juga tidak elegan.
Saya menemukan sedikit perubahan pada kode @ Zac untuk menyelesaikan 3 bug ini. Mengenai bug # 3, saya masih belum dapat sepenuhnya menghapus semua nol di depan; Itu selalu bisa menjadi satu, tetapi 00, 01, 0100 dll dalam kasus itu, lebih elegan dan valid bahwa 000000, 001, 000100, dll. Dll
Ini kodenya:
Semoga harimu menyenangkan!
sumber
Inilah jawaban saya atas jawaban Pratik Sharma untuk
Kotlin
danDouble
jika ada yang membutuhkannyasumber