Trong Android EditText, làm thế nào để buộc viết chữ hoa?


144

Trong ứng dụng Android của tôi, tôi có EditTextnơi người dùng có thể nhập thông tin. Nhưng tôi cần buộc người dùng viết bằng chữ in hoa. Bạn có biết một chức năng để làm điều đó?

Câu trả lời:


340

Android thực sự có InputFilter tích hợp chỉ dành cho việc này !

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

Hãy cẩn thận, setFilters sẽ đặt lại tất cả các thuộc tính khác mà đã được thiết lập thông qua XML (ví dụ maxLines, inputType, imeOptinos...). Để ngăn chặn điều này, hãy thêm (các) Bộ lọc cho những bộ lọc đã tồn tại.

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

3
Đúng! Đây là câu trả lời tốt nhất! Các mã nên được edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});mặc dù.
Arthur

4
OK bạn đã đúng, tôi cập nhật câu trả lời của tôi. Cảm ơn đã giúp cải thiện điều này !!
ErlVolton

4
Để tránh ghi đè các bộ lọc bạn đặt trên xml (ví dụ maxLength:), hãy thử nối thêm InputFilter.AllCaps()vào editText.getFiltersmảng. Xem stackoverflow.com/a/18934659/3890983
nhiệt đới

20
Hoặc chỉ trong KotlineditText.filters = editText.filters + InputFilter.AllCaps()
Ilia Kurtov

4
Tốt hơn nữa: editText.filters += InputFilter.AllCaps()Tuyệt vời của Kotlin! <3
Milack27

123

Nếu bạn muốn buộc người dùng viết bằng chữ in hoa theo mặc định trong EditText của bạn, bạn chỉ cần thêm android:inputType="textCapCharacters". (Người dùng vẫn có thể tự thay đổi thành chữ thường.)


39
không có gì ngăn người dùng nhấn 'shift' và viết một chữ cái thấp hơn.
Fernando Leal

Đồng ý với Fernando, mặc dù bàn phím mặc định là mũ, nhưng nó không yêu cầu chúng.
pforhan 4/2/2015

Người dùng có thể sử dụng nút shift để nhập thư trường hợp nhỏ như đã nói bởi @Fernando
Ajinkya

24

Đặt input typethành TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS. Các keyboardnên tôn trọng điều đó.


android: inputType = "textCapChar character"
Parth Kapoor

18

Bạn có thể sử dụng hai cách.

Cách thứ nhất:

Đặt android:inputType="textCapSentences"trên EditText của bạn.

Cách thứ hai:

Khi người dùng nhập số bạn phải sử dụng trình xem văn bản và đổi chữ nhỏ thành chữ in hoa.

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

2
giải pháp của bạn không hoạt động vì nó đặt chuỗi theo thứ tự ngược lại.
co2f2e

cách bạn sử dụng đầu tiên hoặc thứ hai.
Harshid

Đầu tiên là không làm việc cả. Cái thứ hai làm cho chữ hoa viết hoa nhưng chúng ta phải lập trình con trỏ ở cuối câu.
co2f2e

@Kalanamith ya thì có vấn đề gì
Harshid

6
Đối với tùy chọn đầu tiên textCapSentences viết hoa câu, bạn cần textCapChar character.
Ghoti

13

Bạn có thể thêm thuộc android:textAllCaps="true"tính vào tệp xml của mình trong EditText. Điều này sẽ bắt buộc bàn phím softinput xuất hiện trong tất cả các chế độ mũ. Giá trị bạn nhập sẽ xuất hiện trong Uppercase. Tuy nhiên, điều này sẽ không đảm bảo rằng người dùng chỉ có thể nhập bằng UpperCasechữ cái. Nếu họ muốn, họ vẫn có thể rơi lại các chữ cái viết thường. Nếu bạn muốn đảm bảo rằng đầu ra của Edittexttất cả nằm trong Tất cả các mũ, thì bạn phải chuyển đổi thủ công Chuỗi đầu vào bằng toUpperCase()phương thức của Stringlớp.


@GustavoAlves, bạn có thể chỉ cho tôi biết chuyện gì đã xảy ra khi bạn thử cái này không? Có thể tôi có thể xem xét vấn đề của bạn. :)
Abhishek

Xin chào @ Abhishek. Đặt thuộc tính không thay đổi bất cứ điều gì. EditText vẫn chấp nhận cả ký tự chữ hoa và chữ thường.
Gus Costa

1
Có nếu bạn muốn hạn chế EditText chỉ chấp nhận các ký tự Uppercase thì đối với bạn, android: inputType = "textCapChar character" sẽ là lựa chọn phù hợp. Hãy thử và sau đó cho tôi biết. ☺️
Abhishek

1
Điều này gây ra và chỉ số ra khỏi giới hạn ngoại lệ khi mỗi tôi gõ.
Zapnologica

2
android:textAllCaps="true"chỉ là một thuộc tính của TextView ( stackoverflow.com/a/28804492/5268730 ). Sử dụng android:inputType="textCapCharacters"thay thế.
woodii

11

Bạn nên đặt android:inputType="textCapCharacters"với Edittext trong tệp xml.


9
AoyamaNanami đã viết chính xác cùng một câu trả lời. Vui lòng tập trung vào các câu hỏi hiện tại hơn, câu hỏi này là từ năm 2013. :)
Byteroulette

2
Lưu ý rằng người dùng có thể thay đổi và nhập các ký tự thấp hơn
Rafa0809

10

Thay vì lo lắng về việc làm việc với bàn phím, tại sao không chấp nhận bất kỳ đầu vào, chữ thường hoặc chữ hoa và chuyển đổi chuỗi thành chữ hoa?

Các mã sau đây sẽ giúp:

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

Điều này thân thiện với người dùng vì người dùng không cần thiết phải biết rằng bạn cần chuỗi chữ hoa. Hi vọng điêu nay co ich.


9

Thậm chí tốt hơn ... một lớp lót trong Kotlin ...

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

Làm xong!


2
Bạn có thể viết nó bằng cú pháp truy cập thuộc tính: <your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
Makotosan

8
Tốt hơn nữa:<your_edit_text>.filters += InputFilter.AllCaps()
Makotosan

9

Trong kotlin , trong tệp .kt thực hiện thay đổi:

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

Sử dụng tài sản tổng hợp để truy cập trực tiếp của widget với id. Và trong XML, đối với văn bản chỉnh sửa của bạn, hãy thêm một vài cờ nữa như:

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

Điều này sẽ cập nhật bàn phím khi bật chữ hoa.


8

Sử dụng bộ lọc đầu vào

editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

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

6

Chỉ cần làm điều này:

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

5

Hãy thử sử dụng bất kỳ một trong các mã dưới đây có thể giải quyết vấn đề của bạn.

theo chương trình:

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

XML:

android:inputType="textCapCharacters" with Edittext

4

Đối với tôi, nó hoạt động bằng cách thêm android: textAllCaps = "true"android: inputType = "textCapChar character"

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

3

Để có được tất cả vốn, hãy sử dụng như sau trong XML của bạn:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
/>

2
bạn đã thử giải pháp này chưa? điều này dẫn đến sự cố ứng dụng khi người dùng bắt đầu chỉnh sửa nội dung của editext
surhidamatya

3

Hãy thử mã này, nó sẽ làm cho đầu vào của bạn thành chữ hoa

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

2

Dựa trên câu trả lời được chấp nhận, câu trả lời này cũng tương tự, nhưng trong Kotlin. Chỉ để dễ dàng sao chép: ·)

private fun EditText.autocapitalize() {
    val allCapsFilter = InputFilter.AllCaps()
    setFilters(getFilters() + allCapsFilter)
}

1
filters += InputFilter.AllCaps(): D
crgarridos

1

Để có bàn phím viết hoa khi nhấp vào edittext, hãy sử dụng mã này trong xml của bạn,

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

1

Tôi đang sử dụng Visual Studio 2015 / Xamarin để xây dựng ứng dụng của mình cho cả Android 5.1 và Android 6.0 (cùng một apk được cài đặt trên cả hai).

Khi tôi chỉ định android:inputType="textCapCharacters"trong axml của mình, bàn phím AllCaps xuất hiện như mong đợi trên Android 6.0, nhưng không phải Android 5.1. Tôi đã thêm vào android:textAllCaps="true"axml của mình và vẫn không có bàn phím AllCaps trên Android 5.1. Tôi đã đặt bộ lọc bằng cách sử dụng EditText.SetFilters(new IInputFilter[] { new InputFilterAllCaps() });và trong khi bàn phím mềm hiển thị các ký tự chữ thường trên Android 5.1, trường nhập liệu bây giờ là AllCaps.

EDIT: Sự khác biệt về hành vi mà tôi quan sát và cho là có liên quan đến hệ điều hành thực ra là do tôi có các phiên bản Bàn phím Google khác nhau trên các thiết bị thử nghiệm. Khi tôi cập nhật các thiết bị lên Bàn phím Google mới nhất (phát hành vào tháng 7 năm 2016 kể từ khi viết bài này), hành vi 'Tất cả các mũ' là nhất quán trên các hệ điều hành. Bây giờ, tất cả các thiết bị hiển thị các ký tự chữ thường trên bàn phím, nhưng đầu vào là All Caps vìSetFilters(new IInputFilter[] { new InputFilterAllCaps() });


1
Xin chào Tony, có vẻ như bạn đã tạo 2 tài khoản; stackoverflow.com/users/6764633/tony-celiastackoverflow.com/users/6771440/deeveedee . Nếu bạn muốn hợp nhất chúng, hãy xem stackoverflow.com/help/merging-accounts .
Matt

Cảm ơn, Matt. Phấn này lên cho người mới bắt đầu học / sai lầm. Không nhớ rằng tôi đã tạo một tài khoản khác cho đến khi bạn chỉ ra nó. may mắn thay, chức năng hợp nhất tài khoản rất đơn giản. Diễn đàn tuyệt vời!
Tony

1

Xamarin tương đương với câu trả lời của ErlVolton:

editText.SetFilters(editText.GetFilters().Append(new InputFilterAllCaps()).ToArray());

Đây là lý do tại sao tôi thích làm thế nào C # có thể ngắn gọn như vậy.
Lionet Chen

1

Thực hiện kotlin đơn giản

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

PS đối với tôi filterslúc nào cũng trống


0

Một lớp lót Java 1 của giải pháp được đề xuất có thể là:

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

Lưu ý nó cần com.google.common.collect.Lists.


-1

Đơn giản, Thêm mã dưới đây vào EditText của tệp xml của bạn.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Và nếu bạn muốn cho phép cả chữ in hoa và chữ số thì hãy sử dụng mã bên dưới.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"

2
Điều đó chắc chắn hoạt động, nhưng nó không phải là một trải nghiệm người dùng rất tốt. Tôi mới dùng thử và vì bàn phím không tự động kích hoạt (ít nhất là trên N), các ký tự gõ chữ thường chỉ bị bỏ qua mà không có phản hồi cho người dùng, khiến giao diện người dùng dường như bị hỏng.
MattMatt

hoàn toàn đồng ý với @MattMatt. Nếu chúng ta làm điều đó, người dùng sẽ không thể nhập các chữ cái nhỏ. Người dùng có thể nhập bất kỳ trường hợp nào họ muốn và phần còn lại sẽ tự động viết hoa các từ
Mir Adnan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.