Di Android EditText, bagaimana cara memaksa penulisan huruf besar?

144

Dalam aplikasi Android saya, saya memiliki perbedaan di EditTextmana pengguna dapat memasukkan informasi. Tapi saya harus memaksa pengguna untuk menulis dalam huruf besar. Apakah Anda tahu fungsi untuk melakukan itu?

Natacha
sumber

Jawaban:

340

Android sebenarnya memiliki InputFilter bawaan hanya untuk ini !

edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});

Hati-hati, setFilters akan mengatur ulang semua atribut lain yang ditetapkan melalui XML (mismaxLines , inputType, imeOptinos...). Untuk mencegah hal ini, tambahkan Anda Filter ke yang sudah ada.

InputFilter[] editFilters = <EditText>.getFilters();
InputFilter[] newFilters = new InputFilter[editFilters.length + 1];
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
newFilters[editFilters.length] = <YOUR_FILTER>;  
<EditText>.setFilters(newFilters);
ErlVolton
sumber
3
Iya! Ini jawaban terbaik! Kode seharusnya edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});.
Arthur
4
OK kalian benar, saya memperbarui jawaban saya. Terima kasih telah membantu meningkatkan ini !!
ErlVolton
4
Untuk menghindari mengganti filter yang Anda atur pada xml (untuk mis. maxLength), Cobalah untuk menambahkan array InputFilter.AllCaps()ke editText.getFilters. Lihat stackoverflow.com/a/18934659/3890983
tropicalfish
21
Atau di Kotlin sajaeditText.filters = editText.filters + InputFilter.AllCaps()
Ilia Kurtov
4
Lebih baik lagi: editText.filters += InputFilter.AllCaps()Kotlin luar biasa! <3
Milack27
123

Jika Anda ingin memaksa pengguna untuk menulis dalam huruf besar secara default di EditText Anda, Anda hanya perlu menambahkan android:inputType="textCapCharacters". (Pengguna masih dapat mengubah secara manual menjadi huruf kecil.)

Aoyama Nanami
sumber
39
tidak ada yang mencegah Pengguna menekan 'shift' dan menulis surat dengan huruf kecil.
Fernando Leal
Setuju dengan Fernando, meskipun keyboard standar untuk tutup, itu tidak mengharuskan mereka.
pforhan
Pengguna dapat menggunakan tombol shift untuk memasukkan huruf kecil seperti yang dikatakan oleh @Fernando
Ajinkya
24

Setel input typeke TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS. The keyboardharus menghormati itu.

Gabe Sechan
sumber
android: inputType = "textCapCharacters"
Parth Kapoor
18

Anda bisa menggunakan dua arah.

Cara pertama:

Set android:inputType="textCapSentences" pada EditText Anda.

Jalan kedua:

Ketika pengguna memasukkan nomor Anda harus menggunakan pengamat teks dan mengubah kecil menjadi huruf kapital.

edittext.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {            

    }
        @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {             
    }
    @Override
    public void afterTextChanged(Editable et) {
          String s=et.toString();
      if(!s.equals(s.toUpperCase()))
      {
         s=s.toUpperCase();
         edittext.setText(s);
         edittext.setSelection(edittext.length()); //fix reverse texting
      }
    }
});  
Harshid
sumber
2
solusi Anda tidak berfungsi karena menetapkan string pada urutan terbalik.
co2f2e
mana yang Anda gunakan pertama atau kedua.
Harshid
Yang pertama tidak berfungsi sama sekali. Yang kedua membuat teks huruf besar tetapi kita harus mengatur kursor ke akhir kalimat secara terprogram.
co2f2e
@Kalanamith ya lalu apa masalahnya
Harshid
6
Untuk opsi pertama textCapSentences memberi huruf kapital pada kalimat, Anda memerlukan textCapCharacters.
Ghoti
13

Anda dapat menambahkan android:textAllCaps="true"properti ke file xml Anda di EditText. Ini akan memaksa keyboard softinput muncul di semua mode caps. Nilai yang Anda masukkan akan muncul di Huruf Besar. Namun, ini tidak akan memastikan bahwa pengguna hanya dapat memasukkan UpperCasehuruf. Jika mereka mau, mereka masih bisa kembali ke huruf kecil. Jika Anda ingin memastikan bahwa output Edittextdalam Semua huruf besar, maka Anda harus secara manual mengkonversi String input menggunakan toUpperCase()metode Stringkelas.

Abhishek
sumber
@ GustavoAlves, Bisakah Anda memberi tahu saya apa yang terjadi ketika Anda mencoba ini? Mungkin saya bisa melihat masalah Anda. :)
Abhishek
Hai @Abhishek. Pengaturan properti tidak mengubah apa pun. EditText masih menerima karakter huruf besar dan kecil.
Gus Costa
1
Ya jika Anda ingin membatasi EditText Anda hanya untuk menerima huruf besar maka untuk Anda, android: inputType = "textCapCharacters" akan menjadi pilihan yang tepat. Cobalah dan beri tahu saya. ☺️
Abhishek
1
Ini menyebabkan dan indeks keluar dari batas pengecualian ketika setiap saya mengetik.
Zapnologica
2
android:textAllCaps="true"hanya properti dari TextView ( stackoverflow.com/a/28803492/5268730 ). Gunakan android:inputType="textCapCharacters"sebagai gantinya.
woodii
11

Anda harus meletakkan android:inputType="textCapCharacters"dengan Edittext dalam file xml.

Pabel
sumber
9
AoyamaNanami menulis jawaban yang persis sama. Harap fokus pada pertanyaan terkini, yang ini berasal dari 2013. :)
ByteHamster
2
Perhatikan bahwa pengguna dapat menggeser dan memasukkan karakter yang lebih rendah
Rafa0809
10

Daripada khawatir berurusan dengan keyboard, mengapa tidak hanya menerima input, huruf kecil atau huruf besar dan mengubah string menjadi huruf besar?

Kode berikut akan membantu:

EditText edit = (EditText)findViewById(R.id.myEditText);
String input;
....
input = edit.getText();
input = input.toUpperCase(); //converts the string to uppercase

Ini ramah pengguna karena tidak perlu bagi pengguna untuk mengetahui bahwa Anda memerlukan string dalam huruf besar. Semoga ini membantu.

anthonycr
sumber
9

Bahkan lebih baik ... satu liner di Kotlin ...

// gets your previous attributes in XML, plus adds AllCaps filter    
<your_edit_text>.setFilters(<your_edit_text>.getFilters() + InputFilter.AllCaps())

Selesai!

S Pimenta
sumber
2
Anda dapat menulisnya menggunakan sintaks akses properti: <your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
Makotosan
8
Lebih baik lagi:<your_edit_text>.filters += InputFilter.AllCaps()
Makotosan
9

Di kotlin , dalam file .kt buat perubahan:

edit_text.filters = edit_text.filters + InputFilter.AllCaps()

Gunakan properti sintetis untuk akses langsung widget dengan id. Dan dalam XML, untuk teks edit Anda tambahkan beberapa tanda lagi sebagai:

<EditText
    android:id="@+id/edit_text_qr_code"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ...other attributes...
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
    />

Ini akan memperbarui keyboard sebagai huruf besar diaktifkan.

vishnu benny
sumber
8

Gunakan filter input

editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
Sreejesh K Nair
sumber
6
edittext.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {            

    }
        @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {             
    }
    @Override
    public void afterTextChanged(Editable et) {
          String s=et.toString();
      if(!s.equals(s.toUpperCase()))
      {
         s=s.toUpperCase();
         edittext.setText(s);
      }
      editText.setSelection(editText.getText().length());
    }
});  
Anderson Carvalho
sumber
6

Lakukan saja ini:

// ****** Every first letter capital in word *********
<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textCapWords"
    />

//***** if all letters are capital ************

    android:inputType="textCapCharacters"
Pravin Suthar
sumber
5

Coba gunakan salah satu dari kode di bawah ini untuk menyelesaikan masalah Anda.

secara terprogram:

editText.filters = editText.filters + InputFilter.AllCaps()

XML:

android:inputType="textCapCharacters" with Edittext
Nivedh
sumber
4

Bagi saya ini bekerja dengan menambahkan android: textAllCaps = "true" dan android: inputType = "textCapCharacters"

<android.support.design.widget.TextInputEditText
                    android:layout_width="fill_parent"
                    android:layout_height="@dimen/edit_text_height"
                    android:textAllCaps="true"
                    android:inputType="textCapCharacters"
                    />
Udara Abeythilake
sumber
3

Untuk mendapatkan semua modal, gunakan yang berikut ini di XML Anda:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
/>
akshay shetty
sumber
2
Sudahkah Anda mencoba solusi ini? ini mengakibatkan crash aplikasi ketika pengguna mulai mengedit konten editext
surhidamatya
3

coba kode ini akan membuat input Anda menjadi huruf besar

edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});
Agil anbu
sumber
2

Berdasarkan jawaban yang diterima, jawaban ini melakukan hal yang sama, tetapi di Kotlin. Hanya untuk memudahkan copypasting: ·)

private fun EditText.autocapitalize() {
    val allCapsFilter = InputFilter.AllCaps()
    setFilters(getFilters() + allCapsFilter)
}
Roc Boronat
sumber
1
filters += InputFilter.AllCaps(): D
crgarridos
1

Untuk mendapatkan papan ketik kapital saat klik edittext gunakan kode ini di xml Anda,

<EditText
    android:id="@+id/et"
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:hint="Input your country"
    android:padding="10dp"
    android:inputType="textCapCharacters"
    />
Ashana.Jackol
sumber
1

Saya menggunakan Visual Studio 2015 / Xamarin untuk membangun aplikasi saya untuk Android 5.1 dan Android 6.0 (apk sama diinstal pada keduanya).

Ketika saya tentukan android:inputType="textCapCharacters"di axml saya, keyboard AllCaps muncul seperti yang diharapkan pada Android 6.0, tetapi bukan Android 5.1. Saya menambahkan android:textAllCaps="true"ke axml saya dan masih tidak ada keyboard AllCaps di Android 5.1. Saya menetapkan filter menggunakan EditText.SetFilters(new IInputFilter[] { new InputFilterAllCaps() });dan sementara keyboard lunak menunjukkan karakter huruf kecil pada Android 5.1, bidang input sekarang AllCaps.

EDIT: Perbedaan perilaku yang saya amati dan diasumsikan terkait OS sebenarnya karena saya memiliki berbagai versi Google Keyboard pada perangkat uji. Setelah saya memperbarui perangkat ke Google Keyboard terbaru (dirilis Juli 2016 saat tulisan ini dibuat), perilaku 'Semua Caps' konsisten di seluruh OS. Sekarang, semua perangkat menunjukkan karakter huruf kecil pada keyboard, tetapi inputnya adalah Semua Huruf karenaSetFilters(new IInputFilter[] { new InputFilterAllCaps() });

Tony
sumber
1
Hai Tony, sepertinya Anda telah membuat 2 akun; stackoverflow.com/users/6764633/tony-celia dan stackoverflow.com/users/6771440/deeveedee . Jika Anda ingin menggabungkan mereka, lihat stackoverflow.com/help/merging-accounts .
Matt
Terima kasih, Matt. Kapur yang satu ini hingga pembelajaran pemula / kesalahan. Tidak ingat bahwa saya telah membuat akun lain sampai Anda menunjukkannya. untungnya, fungsi penggabungan akun itu sederhana. Forum hebat!
Tony
1

Xamarin setara dengan jawaban ErlVolton:

editText.SetFilters(editText.GetFilters().Append(new InputFilterAllCaps()).ToArray());
stovroz
sumber
Inilah sebabnya saya suka bagaimana C # bisa begitu ringkas.
Lionet Chen
1

Realisasi kotlin sederhana

fun EditText.onlyUppercase() {
    inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS
    filters = arrayOf(InputFilter.AllCaps())
}

PS untuk saya filtersselalu kosong pada awalnya

Vlad
sumber
0

Java 1-liner dari solusi yang diusulkan dapat berupa:

editText.setFilters(Lists.asList(new InputFilter.AllCaps(), editText.getFilters())
    .toArray(new InputFilter[editText.getFilters().length + 1]));

Perhatikan itu perlu com.google.common.collect.Lists.

boriguen
sumber
-1

Cukup, Tambahkan kode di bawah ini ke EditText file xml Anda.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Dan jika Anda ingin membolehkan teks huruf besar dan angka, gunakan kode di bawah ini.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
Khusboo
sumber
2
Itu pasti bekerja, tetapi itu bukan pengalaman pengguna yang sangat menyenangkan. Saya baru saja mencobanya dan karena keyboard tidak autocapitalise (setidaknya pada N), karakter yang diketik dalam huruf kecil hanya diabaikan tanpa umpan balik kepada pengguna, membuat UI tampak rusak.
MattMatt
sepenuhnya setuju dengan @MattMatt. Jika kami melakukannya, pengguna tidak akan dapat mengetik huruf kecil. Pengguna harus dapat mengetikkan huruf apa pun yang diinginkannya dan sisanya harus huruf besar secara otomatis
Mir Adnan