ตั้ง inputType สำหรับ EditText โดยทางโปรแกรมหรือไม่


216

เราจะตั้งค่าประเภทอินพุตสำหรับ EditText แบบเป็นโปรแกรมได้อย่างไร? ฉันกำลังพยายาม:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

ดูเหมือนว่าจะไม่มีผลใด ๆ

คำตอบ:


213

ตามTextView docsเวอร์ชัน Android ของโปรแกรม: รหัสผ่านคือsetTransformationMethod ()ไม่ใช่ setInputType () ดังนั้นสิ่งที่ชอบ:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

ควรทำเคล็ดลับ


4
เพื่อเพิ่มสิ่งนี้คุณต้องเรียกใช้ setTransformationMethod แทน setInputType การเรียกใช้ setInputType หลังจาก setTransformationMethod ทำให้ EditText ไม่ได้อยู่ในโหมดรหัสผ่านอีกครั้ง
Paul Ryland

11
คำตอบนี้ผิดสำหรับคำถามที่ถูกถาม เพียงแปลงข้อความที่ป้อนในEditText(แทนที่อักขระด้วยจุดรหัสผ่าน) สิ่งนี้จะไม่มีผลใด ๆ กับสิ่งที่ได้รับอนุญาตให้เข้าไปในEditTextตัวมันเอง
slinden77

4
ในที่สุด setInputType จะเรียกใช้ setTransformation วิธีการจากภายในดังนั้นหากคุณส่ง TYPE_TEXT_VARIATION_PASSWORD ไปที่ setInputType มันจะทำสิ่งนี้ให้คุณ ดูเหมือนว่าปัญหาจะเกิดขึ้นในการเรียก setSingleLine หลังจากเรียก setInputType ซึ่งจะเรียกใช้ setTransformationMethod ด้วย null หรือหม้อแปลงบรรทัดเดียวจึงล้างหม้อแปลงรหัสผ่านออก
sparkym3

หลังจากที่โทร setTransformationMethod (PasswordTransformationMethod.getInstance ()) ฉันไม่สามารถสามารถที่จะแก้ไขมัน
Sujith s

แต่รหัสผ่านจะแสดงเป็นข้อความที่แนะนำในครั้งต่อไปที่ใช้ฟิลด์
Gary Davies

408

สำหรับการตั้งค่าประเภทอินพุตสำหรับ EditText โดยทางโปรแกรมคุณต้องระบุว่าประเภทคลาสอินพุตเป็นข้อความ

editPass.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

2
เคล็ดลับของคุณทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน! ฉันมีปัญหาคล้ายกันกับการตั้งค่าชนิดอินพุตเป็น multiline โดยทางโปรแกรม
Anna Lam

ความสำคัญของการมีผู้ประกอบการระดับบิตหรือที่นี่คืออะไร? ขออภัยฉันใหม่สำหรับ Android
sanjeev

ฉันไม่เห็นด้วย InputType.TYPE_TEXT_VARIATION_PASSWORD ไม่ทำงานสำหรับฉัน แต่ setTransformationMethod (PasswordTransformationMethod.getInstance ()); ทำ !
Lluis Felisart

38

ต่อไปนี้เป็นประเภทอินพุตที่หลากหลายตามที่แสดงบนแป้นพิมพ์มาตรฐาน

การสาธิตประเภทอินพุต

การตั้งค่าประเภทอินพุตโดยทางโปรแกรม

editText.setInputType(InputType.TYPE_CLASS_TEXT);

ตัวเลือกอื่น ๆ นอกจากนี้TYPE_CLASS_TEXTสามารถพบได้ในเอกสาร

การตั้งค่าประเภทอินพุตใน XML

<EditText
    android:inputType="text"
/>

ตัวเลือกอื่น ๆ นอกจากนี้textสามารถพบได้ในเอกสาร

รหัสเสริม

นี่คือรหัสสำหรับภาพด้านบน

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;
    List<InputTypeItem> inputTypes;
    int counter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);
        initArray();
    }

    public void onChangeInputTypeButtonClick(View view) {
        if (counter >= inputTypes.size()) {
            startOver();
            return;
        }
        textView.setText(inputTypes.get(counter).name);
        editText.setInputType(inputTypes.get(counter).value);
        editText.setSelection(editText.getText().length());
        counter++;
    }

    private void startOver() {
        counter = 0;
        textView.setText("");
        editText.setInputType(InputType.TYPE_CLASS_TEXT);
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }


    private void initArray() {
        inputTypes = new ArrayList<>();
        inputTypes.add(new InputTypeItem("date",  InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE));
        inputTypes.add(new InputTypeItem("datetime", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("none", InputType.TYPE_NULL));
        inputTypes.add(new InputTypeItem("number",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("numberDecimal",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL));
        inputTypes.add(new InputTypeItem("numberPassword",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("numberSigned", InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED));
        inputTypes.add(new InputTypeItem("phone",  InputType.TYPE_CLASS_PHONE));
        inputTypes.add(new InputTypeItem("text",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("textAutoComplete", InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE));
        inputTypes.add(new InputTypeItem("textAutoCorrect",  InputType.TYPE_TEXT_FLAG_AUTO_CORRECT));
        inputTypes.add(new InputTypeItem("textCapCharacters",  InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS));
        inputTypes.add(new InputTypeItem("textCapSentences",  InputType.TYPE_TEXT_FLAG_CAP_SENTENCES));
        inputTypes.add(new InputTypeItem("textCapWords",  InputType.TYPE_TEXT_FLAG_CAP_WORDS));
        inputTypes.add(new InputTypeItem("textEmailAddress",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textEmailSubject", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT));
        inputTypes.add(new InputTypeItem("textFilter",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER));
        inputTypes.add(new InputTypeItem("textLongMessage",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE));
        inputTypes.add(new InputTypeItem("textMultiLine",  InputType.TYPE_TEXT_FLAG_MULTI_LINE));
        inputTypes.add(new InputTypeItem("textNoSuggestions", InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
        inputTypes.add(new InputTypeItem("textPassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("textPersonName", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME));
        inputTypes.add(new InputTypeItem("textPhonetic",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC));
        inputTypes.add(new InputTypeItem("textPostalAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS));
        inputTypes.add(new InputTypeItem("textShortMessage", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE));
        inputTypes.add(new InputTypeItem("textUri",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI));
        inputTypes.add(new InputTypeItem("textVisiblePassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
        inputTypes.add(new InputTypeItem("textWebEditText",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT));
        inputTypes.add(new InputTypeItem("textWebEmailAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textWebPassword", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD));
        inputTypes.add(new InputTypeItem("time", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME));
    }

    class InputTypeItem {
        private String name;
        private int value;
        InputTypeItem(String name, int value) {
            this.name = name;
            this.value = value;
        }
    }
}

ดูสิ่งนี้ด้วย


29

ฉันได้แก้ทั้งหมดด้วย

.setInputType(InputType.TYPE_CLASS_NUMBER);

เพื่อดูข้อมูลที่ชัดเจนและ

.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);

เพื่อดูจุด (ถ้าข้อมูลเป็นตัวเลขมันไม่ใช่ทางเลือกของคลาสอื่น)


สิ่งนี้ได้ผลขอบคุณ! มีคำถามข้อหนึ่งอยู่ทำไมฉันต้องเพิ่ม 'หรือ' เมื่อเปลี่ยนจากข้อความธรรมดาเป็นประเภทรหัสผ่าน? เหตุใดฉันจึงไม่สามารถทำสิ่งนี้: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD) ;? ฉันพยายามแล้ว แต่ก็ใช้ไม่ได้
UnknownUser

15

วิธีอนุญาตเฉพาะตัวเลข:

password1.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_CLASS_NUMBER);

วิธีแปลง (ซ่อน) รหัสผ่าน:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// คุณสามารถเปลี่ยน TYPE _... ตามความต้องการของคุณ


5

สำหรับ Kotlin:

    val password = EditText(this)
    password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
    password.hint = "Password"

4

นี่อาจช่วยคนอื่น ๆ เช่นฉันที่ต้องการสลับระหว่างรหัสผ่านและโหมดข้อความอิสระ ฉันลองใช้วิธีป้อนข้อมูลที่แนะนำ แต่ใช้งานได้ในทิศทางเดียวเท่านั้น ฉันสามารถเปลี่ยนรหัสผ่านเป็นข้อความได้ แต่ฉันไม่สามารถเปลี่ยนกลับได้ สำหรับผู้ที่พยายามจัดการสลับ (เช่นกล่องกาเครื่องหมายแสดงรหัสผ่าน) ใช้

       @Override
        public void onClick(View v)
        {
            if(check.isChecked())
            {
                edit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                Log.i(TAG, "Show password");
            }
            else
            {
                edit.setTransformationMethod(PasswordTransformationMethod.getInstance());
                Log.i(TAG, "Hide password");
            }
        }

ฉันต้องเครดิตนี้สำหรับการแก้ปัญหา หวังว่าฉันจะพบว่าไม่กี่ชั่วโมงที่ผ่านมา!


1

วิธียกเลิกการซ่อนรหัสผ่าน:

editText.setInputType(
      InputType.TYPE_CLASS_TEXT|
      InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
);

ในการซ่อนรหัสผ่านอีกครั้ง:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());

0

ลองเพิ่มสิ่งนี้ลงในแท็ก EditText / TextView ในเลย์เอาต์ของคุณ

android:password="true"

แก้ไข: ฉันเพิ่งอ่านโพสต์ของคุณใหม่บางทีคุณอาจต้องทำสิ่งนี้หลังจากการก่อสร้าง ฉันไม่เห็นว่าทำไมข้อมูลโค้ดของคุณไม่ทำงาน


ฉันไม่มีไฟล์เลย์เอาต์ในกรณีนี้ฟิลด์กำลังถูกสร้างขึ้นแบบเป็นโปรแกรม
246114

ใช่มันกำลังถูกสร้างขึ้นหลังจากการก่อสร้างไม่แน่ใจว่าทำไมมันไม่ทำงานเช่นกัน!
246114

6
ตัวเลือกนี้เลิกใช้แล้ว !!
swiftBoy

สิ่งนี้เป็นเพียงสิ่งเดียวที่ทำงานได้กับ Android 2.3 รุ่นเก่าฉันได้ตอบคำถามนี้แล้ว
djdance

0

ฉันรู้ว่าคำตอบที่คาดหวังคือJavaอะไร แต่นี่คือคำแนะนำ 2 เซนต์ของฉันพยายามที่จะจัดการกับสิ่งต่าง ๆ ที่เกี่ยวข้องในมุมมองXML(อย่างน้อยสิ่งพื้นฐาน) ดังนั้นฉันขอแนะนำให้ใช้xmlแอตทริบิวต์แทนการจัดการกับกรณีการใช้นี้java

    <EditText
     android:inputType="textPassword"/>

2
ในบางกรณีคุณอาจต้องการสลับระหว่างประเภทอินพุตที่แตกต่างกันเช่นการซ่อน / แสดงรหัสผ่านที่ป้อนในฟิลด์ ซึ่งเป็นสิ่งที่ให้ฉันไปที่หน้านี้
วิลเลียม

1
แต่สำหรับการที่มีตัวเลือกใน EditText ที่ให้คุณแสดง / ซ่อนรหัสผ่านไม่จำเป็นต้องทำด้วยตัวคุณเองมันยังให้ภาพเคลื่อนไหวที่ดีสำหรับสิ่งนั้น
pratham kesarkar

ขอบคุณสำหรับข้อมูลที่ฉันได้เห็นมันที่นี่stackoverflow.com/a/41163578/3310235
วิลเลียม

0

ซ่อน:

edtPassword.setInputType(InputType.TYPE_CLASS_TEXT);
edtPassword.setTransformationMethod(null);

แสดง:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());

0
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);

นอกจากนี้คุณต้องระวังด้วยว่าเคอร์เซอร์จะย้ายไปที่จุดเริ่มต้นของ editText หลังจากฟังก์ชั่นนี้ถูกเรียกใช้ดังนั้นตรวจสอบให้แน่ใจว่าคุณเลื่อนเคอร์เซอร์ไปที่จุดสิ้นสุดอีกครั้ง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.