Tetapkan inputType untuk EditText secara terprogram?


Jawaban:


213

Menurut dokumen TextView , versi program android: kata sandi adalah setTransformationMethod () , bukan setInputType (). Jadi sesuatu seperti:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

harus melakukan trik.


4
Hanya untuk menambahkan ini, Anda perlu memanggil setTransformationMethod alih - alih setInputType. Memanggil setInputType setelah setTransformationMethod menyebabkan EditText tidak berada dalam mode kata sandi lagi.
Paul Ryland

11
jawaban ini salah untuk pertanyaan yang diajukan. Ini hanya mengubah teks yang dimasukkan dalam EditText(menggantikan karakter dengan titik kata sandi). Ini tidak berpengaruh apa pun pada apa yang diizinkan untuk dimasukkan dalam EditTextdirinya sendiri.
slinden77

4
setInputType akhirnya memanggil setTransformationMethod dari dalam, jadi jika Anda meneruskan TYPE_TEXT_VARIATION_PASSWORD ke setInputType, itu akan melakukan ini untuk Anda. Masalahnya tampaknya ley dalam memanggil setSingleLine setelah memanggil setInputType yang akan memanggil setTransformationMethod dengan nol atau trafo baris tunggal sehingga membersihkan trafo kata sandi.
sparkym3

setelah panggilan setTransformationMethod (PasswordTransformationMethod.getInstance ()) saya tidak dapat mengeditnya
sujith s

tetapi kata sandi akan muncul dalam teks yang disarankan lain kali jika bidang ini digunakan
Gary Davies

408

Untuk mengatur tipe input untuk EditText secara terprogram, Anda harus menentukan bahwa tipe kelas input adalah teks.

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

2
Tip Anda bekerja sempurna untuk saya! Saya memiliki masalah yang sama dengan pengaturan jenis input pemrograman ke multiline.
Anna Lam

Apa pentingnya memiliki operator ATAU bitwise di sini? Maaf, saya baru mengenal android.
sanjeev

Saya tidak setuju InputType.TYPE_TEXT_VARIATION_PASSWORD tidak berfungsi untuk saya tetapi setTransformationMethod (PasswordTransformationMethod.getInstance ()); ya!
Lluis Felisart

37

Berikut adalah berbagai Jenis Input seperti yang ditunjukkan pada keyboard standar.

tipe input demo

Mengatur jenis input secara terprogram

editText.setInputType(InputType.TYPE_CLASS_TEXT);

Pilihan lain selain TYPE_CLASS_TEXTdapat ditemukan dalam dokumentasi .

Mengatur tipe input dalam XML

<EditText
    android:inputType="text"
/>

Pilihan lain selain textdapat ditemukan dalam dokumentasi .

Kode tambahan

Berikut adalah kode untuk gambar di atas.

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

Lihat juga


29

saya sudah menyelesaikan semua dengan

.setInputType(InputType.TYPE_CLASS_NUMBER);

untuk melihat data yang jelas dan

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

untuk melihat titik-titik (jika data adalah angka, itu bukan pilihan dari kelas lain)


Ini berhasil, terima kasih! Satu pertanyaan, mengapa saya perlu menambahkan 'atau' ketika mengubah dari teks biasa ke jenis kata sandi? Mengapa saya tidak bisa melakukan ini saja: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD) ;? Saya mencoba dan tidak berhasil.
Pengguna Tidak Dikenal

15

Untuk hanya mengizinkan angka:

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

Untuk mengubah (menyembunyikan) kata sandi:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// Anda dapat mengubah TYPE _... sesuai dengan kebutuhan Anda.


5

Untuk Kotlin:

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

4

Ini dapat membantu orang lain seperti saya yang ingin beralih antara kata sandi dan mode teks bebas. Saya mencoba menggunakan metode input yang disarankan tetapi hanya bekerja dalam satu arah. Saya dapat beralih dari kata sandi ke teks tetapi kemudian saya tidak dapat kembali. Bagi mereka yang mencoba menangani toggle (mis. Kotak centang Sandi kata sandi) gunakan

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

Saya harus menghargai ini untuk solusinya. Seandainya saya menemukan itu beberapa jam yang lalu!


1

Untuk menyembunyikan kata sandi:

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

Untuk menyembunyikan kata sandi lagi:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());

0

Coba tambahkan ini ke tag EditText / TextView di tata letak Anda

android:password="true"

Sunting: Saya baru saja membaca kembali posting Anda, mungkin Anda perlu melakukan ini setelah konstruksi. Saya tidak mengerti mengapa cuplikan Anda tidak berfungsi.


Saya tidak memiliki file tata letak dalam hal ini, bidang sedang dibuat secara programatik.
user246114

Ya itu sedang dilakukan setelah konstruksi, tidak yakin mengapa itu tidak berhasil juga!
user246114

6
opsi ini sekarang sudah tidak digunakan lagi !!
swiftBoy

hal ini hanya satu yang berfungsi untuk Android 2.3 yang lama, saya telah mengangkat jawabannya.
djdance

0

Saya tahu Jawaban yang diharapkan ada di Java. Tapi, inilah 2 sen saran saya yang selalu mencoba menangani hal-hal terkait tampilan di XML(setidaknya hal-hal dasar) jadi saya sarankan daripada menggunakan xmlatribut daripada menangani kasus penggunaan ini dijava

    <EditText
     android:inputType="textPassword"/>

2
Dalam beberapa kasus, Anda mungkin ingin beralih di antara jenis input yang berbeda misalnya menyembunyikan / menunjukkan kata sandi yang dimasukkan dalam bidang; itulah yang membiarkan saya ke halaman ini
William

1
tetapi untuk itu ada opsi di EditText yang memungkinkan Anda menunjukkan / menyembunyikan kata sandi tidak perlu melakukannya sendiri juga memberikan animasi yang bagus untuk itu.
pratham kesarkar

terima kasih atas informasinya, saya telah melihatnya di sini stackoverflow.com/a/41163578/3310235
William

0

Menyembunyikan:

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

Menunjukkan:

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

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

Anda juga harus berhati-hati agar kursor bergerak ke titik awal dari editTeks setelah fungsi ini dipanggil, jadi pastikan Anda memindahkan kursor ke titik akhir lagi.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.