ใน Android EditText จะบังคับให้เขียนตัวพิมพ์ใหญ่ได้อย่างไร


144

ในแอปพลิเคชัน Android ของฉันฉันมีที่แตกต่างกันEditTextซึ่งผู้ใช้สามารถป้อนข้อมูล แต่ฉันต้องบังคับให้ผู้ใช้เขียนตัวอักษรตัวพิมพ์ใหญ่ คุณรู้ฟังก์ชั่นการทำเช่นนั้นหรือไม่?

คำตอบ:


340

Android มีInputFilter ในตัวสำหรับสิ่งนี้ !

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

ระวังsetFilters จะรีเซ็ตคุณลักษณะอื่น ๆ ทั้งหมดที่ได้รับการตั้งค่าผ่านทาง XML (เช่นmaxLines, inputType, imeOptinos... ) หากต้องการป้องกันไม่ให้เพิ่มตัวกรองลงในรายการที่มีอยู่แล้ว

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
ใช่ นี่คือคำตอบที่ดีที่สุด! รหัสควรเป็นedittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});แม้ว่า
อาเธอร์

4
ตกลงคุณคนถูกต้องฉันปรับปรุงคำตอบของฉัน ขอบคุณที่ช่วยกันปรับปรุงสิ่งนี้ !!
ErlVolton

4
เพื่อหลีกเลี่ยงการเอาชนะตัวกรองที่คุณตั้งอยู่บน XML (สำหรับเช่น. maxLength) พยายามที่จะผนวกInputFilter.AllCaps()การeditText.getFiltersอาร์เรย์ ดูstackoverflow.com/a/18934659/3890983
tropicalfish

21
หรือใน Kotlin เพียงeditText.filters = editText.filters + InputFilter.AllCaps()
Ilia Kurtov

4
ยังดีกว่า: editText.filters += InputFilter.AllCaps()Kotlin ยอดเยี่ยม! <3
Milack27

123

หากคุณต้องการที่จะบังคับให้ผู้ใช้ที่จะเขียนในตัวพิมพ์ใหญ่โดยค่าเริ่มต้นใน EditText android:inputType="textCapCharacters"ของคุณคุณก็ต้องเพิ่ม (ผู้ใช้ยังคงสามารถเปลี่ยนเป็นตัวพิมพ์เล็กได้ด้วยตนเอง)


39
ไม่มีอะไรป้องกันผู้ใช้กด 'shift' และเขียนตัวอักษรที่ต่ำลง
Fernando Leal

เห็นด้วยกับเฟอร์นันโดในขณะที่มันเริ่มต้นแป้นพิมพ์เพื่อหมวก แต่ก็ไม่จำเป็นต้องใช้พวกเขา
pforhan

ผู้ใช้สามารถใช้ปุ่ม Shift เพื่อป้อนตัวอักษรตัวเล็กตามที่กล่าวโดย @Fernando
Ajinkya


18

คุณสามารถใช้สองทาง

วิธีแรก:

ตั้งค่าandroid:inputType="textCapSentences"บน EditText ของคุณ

วิธีที่สอง:

เมื่อผู้ใช้ป้อนหมายเลขคุณจะต้องใช้โปรแกรมดูข้อความและเปลี่ยนอักษรตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่

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
โซลูชันของคุณไม่ทำงานเนื่องจากจะตั้งค่าสตริงในลำดับย้อนกลับ
co2f2e

วิธีที่คุณใช้ครั้งแรกหรือครั้งที่สอง
Harshid

คนแรกไม่ได้ทำงานเลย ส่วนที่สองสร้างตัวพิมพ์ใหญ่ข้อความ แต่เราต้องตั้งค่าเคอร์เซอร์ตามจุดทางประโยค
co2f2e

@ Kalanamith ใช่แล้วมีปัญหาอะไร
Harshid

6
สำหรับตัวเลือกแรก textCapSentences ใช้ประโยคตัวพิมพ์ใหญ่คุณต้องใช้ textCapCharacters
Ghoti

13

คุณสามารถเพิ่มandroid:textAllCaps="true"คุณสมบัติให้กับไฟล์ xml ของคุณใน EditText วิธีนี้จะบังคับใช้แป้นพิมพ์ softinput เพื่อให้ปรากฏในโหมดตัวพิมพ์ใหญ่ทั้งหมด ค่าที่คุณป้อนจะปรากฏในตัวพิมพ์ใหญ่ อย่างไรก็ตามสิ่งนี้จะไม่รับประกันว่าผู้ใช้สามารถป้อนUpperCaseตัวอักษรได้เท่านั้น หากพวกเขาต้องการพวกเขายังสามารถถอยกลับไปที่ตัวอักษรตัวพิมพ์เล็ก หากคุณต้องการให้แน่ใจว่าผลลัพธ์ของEdittextอยู่ในตัวพิมพ์ใหญ่ทั้งหมดแล้วคุณจะต้องแปลงสตริงการป้อนข้อมูลด้วยตนเองโดยใช้toUpperCase()วิธีการStringเรียน


@GustavoAlves คุณแค่บอกฉันว่าเกิดอะไรขึ้นเมื่อคุณลองทำสิ่งนี้ อาจเป็นเพราะฉันสามารถตรวจสอบปัญหาของคุณได้ :)
Abhishek

สวัสดี @Abhishek การตั้งค่าคุณสมบัติไม่เปลี่ยนแปลงอะไรเลย EditText ยังคงยอมรับทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก
Gus Costa

1
ใช่ถ้าคุณต้องการ จำกัด EditText ของคุณเท่านั้นเพื่อยอมรับอักขระตัวพิมพ์ใหญ่แล้วสำหรับคุณ android: inputType = "textCapCharacters" จะเป็นตัวเลือกที่เหมาะสม ลองดูแล้วแจ้งให้เราทราบ ☺️
Abhishek

1
สิ่งนี้ทำให้เกิดและสร้างดัชนีจากข้อยกเว้นทุกครั้งที่ฉันพิมพ์
Zapnologica

2
android:textAllCaps="true"เป็นเพียงคุณสมบัติของ TextView ( stackoverflow.com/a/28803492/5268730 ) ใช้android:inputType="textCapCharacters"แทน
woodii

11

คุณควรใส่android:inputType="textCapCharacters"Edittext ในไฟล์ xml


9
AoyamaNanami เขียนคำตอบเดียวกันทั้งหมด โปรดมุ่งเน้นไปที่คำถามปัจจุบันมากขึ้นอันนี้มาจาก 2013 :)
ByteHamster

2
ขอให้สังเกตว่าผู้ใช้สามารถเลื่อนและป้อนตัวอักษรล่างได้
Rafa0809

10

แทนที่จะกังวลเกี่ยวกับการจัดการกับคีย์บอร์ดทำไมไม่เพียงแค่รับอินพุตตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่แล้วแปลงสตริงเป็นตัวพิมพ์ใหญ่?

รหัสต่อไปนี้ควรช่วย:

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

นี่เป็นมิตรกับผู้ใช้เนื่องจากผู้ใช้ไม่จำเป็นต้องรู้ว่าคุณต้องการสตริงเป็นตัวพิมพ์ใหญ่ หวังว่านี่จะช่วยได้


9

ดียิ่งกว่า ... ซับในKotlin ...

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

ทำ!


2
คุณสามารถเขียนโดยใช้ไวยากรณ์การเข้าถึงคุณสมบัติ: <your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
Makotosan

8
ยังดีกว่า:<your_edit_text>.filters += InputFilter.AllCaps()
Makotosan

9

ในkotlinในไฟล์. kt ทำการเปลี่ยนแปลง:

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

ใช้คุณสมบัติสังเคราะห์สำหรับการเข้าถึงวิดเจ็ตที่มี ID โดยตรง และใน XML สำหรับข้อความแก้ไขของคุณให้เพิ่มแฟล็กอีกสองสามรายการเป็น:

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

การดำเนินการนี้จะอัปเดตคีย์บอร์ดเมื่อเปิดใช้งานตัวพิมพ์ใหญ่



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

แค่ทำสิ่งนี้:

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

ลองใช้รหัสด้านล่างใด ๆ อาจช่วยแก้ปัญหาของคุณได้

programatically:

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

XML:

android:inputType="textCapCharacters" with Edittext

4

สำหรับฉันมันทำงานโดยการเพิ่มAndroid: textAllCaps = "true"และ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"
                    />

3

ในการรับทุนทั้งหมดให้ใช้สิ่งต่อไปนี้ใน XML ของคุณ:

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

2
คุณลองใช้วิธีนี้หรือไม่ สิ่งนี้ส่งผลให้แอปพลิเคชันหยุดทำงานเมื่อผู้ใช้เริ่มแก้ไขเนื้อหาของ editext
surhidamatya

3

ลองใช้รหัสนี้มันจะทำให้การป้อนข้อมูลของคุณเป็นตัวพิมพ์ใหญ่

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

2

ขึ้นอยู่กับคำตอบที่ยอมรับคำตอบนี้ไม่เหมือนกัน แต่ใน Kotlin เพียงเพื่อความสะดวกในการคัดลอก: ·)

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

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

1

หากต้องการรับแป้นพิมพ์ใหญ่เมื่อคลิกedittext ให้ใช้รหัสนี้ใน xml ของคุณ

<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

ฉันใช้ Visual Studio 2015 / Xamarin เพื่อสร้างแอปของฉันสำหรับทั้ง Android 5.1 และ Android 6.0 (apk เดียวกันที่ติดตั้งบนทั้งสอง)

เมื่อฉันระบุ android:inputType="textCapCharacters"ใน axml ของฉันแป้นพิมพ์ AllCaps จะปรากฏตามที่คาดหวังใน Android 6.0 แต่ไม่ใช่ Android 5.1 ฉันเพิ่มลงandroid:textAllCaps="true"ใน axml ของฉันและยังไม่มีแป้นพิมพ์ AllCaps ใน Android 5.1 ฉันตั้งค่าตัวกรองโดยใช้EditText.SetFilters(new IInputFilter[] { new InputFilterAllCaps() });และในขณะที่แป้นพิมพ์อ่อนจะแสดงอักขระตัวพิมพ์เล็กใน Android 5.1 ช่องป้อนข้อมูลคือ AllCaps ในขณะนี้

แก้ไข:ความแตกต่างด้านพฤติกรรมที่ฉันสังเกตและสันนิษฐานว่าเกี่ยวข้องกับระบบปฏิบัติการจริง ๆ แล้วเพราะฉันมี Google Keyboard รุ่นต่างๆบนอุปกรณ์ทดสอบ เมื่อฉันอัปเดตอุปกรณ์เป็น Google Keyboard ล่าสุด (เผยแพร่เมื่อเดือนกรกฎาคม 2559 ตามที่เขียนไว้) พฤติกรรม 'All Caps' นั้นสอดคล้องกันในทุกระบบปฏิบัติการ ตอนนี้อุปกรณ์ทั้งหมดแสดงอักขระตัวพิมพ์เล็กบนคีย์บอร์ด แต่อินพุตคือ All Caps เนื่องจากSetFilters(new IInputFilter[] { new InputFilterAllCaps() });


1
สวัสดีโทนี่ดูเหมือนว่าคุณได้สร้าง 2 บัญชีแล้ว stackoverflow.com/users/6764633/tony-celiaและstackoverflow.com/users/6771440/deeveedee หากคุณต้องการที่จะรวมพวกเขาเห็นstackoverflow.com/help/merging-accounts
Matt

ขอบคุณแมตต์ ชอล์คนี้จนถึงการเริ่มต้นเรียนรู้ / ข้อผิดพลาด จำไม่ได้ว่าฉันได้สร้างบัญชีอื่นจนกว่าคุณจะชี้ให้เห็น โชคดีที่ฟังก์ชั่นการรวมบัญชีนั้นง่าย สุดยอดฟอรัม!
Tony

1

Xamarin เทียบเท่าคำตอบของ ErlVolton:

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

นี่คือเหตุผลที่ฉันรักที่ C # จะกระชับได้อย่างไร
Lionet Chen

1

สำนึก kotlin ง่าย

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

PS สำหรับฉันfiltersว่างเปล่าเสมอในตอนแรก


0

Java 1-liner ของโซลูชันที่เสนออาจเป็น:

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

com.google.common.collect.Listsหมายเหตุจะต้อง


-1

เพียงแค่เพิ่มรหัสด้านล่างลงใน EditText ของไฟล์ xml ของคุณ

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

และหากคุณต้องการอนุญาตให้ทั้งข้อความตัวพิมพ์ใหญ่และตัวเลขใช้รหัสด้านล่าง

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"

2
มันใช้งานได้ดี แต่มันไม่ได้เป็นประสบการณ์ที่ดีสำหรับผู้ใช้ ฉันเพิ่งลองใช้งานและเนื่องจากคีย์บอร์ดไม่ได้เป็นแบบอัตโนมัติ (อย่างน้อย N) ตัวอักษรตัวพิมพ์เล็กจะไม่ได้รับการตอบกลับโดยผู้ใช้ทำให้ UI ดูเหมือนเสีย
MattMatt

เห็นด้วยอย่างสมบูรณ์กับ @MattMatt หากเราทำเช่นนั้นผู้ใช้จะไม่สามารถพิมพ์ตัวอักษรขนาดเล็กได้ ผู้ใช้ควรสามารถพิมพ์สิ่งใดก็ตามที่เขา / เธอต้องการและส่วนที่เหลือควรเป็นตัวพิมพ์ใหญ่คำอัตโนมัติ
Mir Adnan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.