Tetapkan inputType untuk EditText secara terprogram?

216

Bagaimana cara menetapkan tipe input untuk EditText secara terprogram? Saya mencoba:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

tampaknya tidak memiliki efek apa pun.

pengguna246114
sumber

Jawaban:

213

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

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

harus melakukan trik.

rascalking
sumber
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);
Amitku
sumber
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

Suragch
sumber
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)

orang kikir
sumber
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());
slinden77
sumber
7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

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

Ajeet
sumber
5

Untuk Kotlin:

    val password = EditText(this)
    password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
    password.hint = "Password"
Ronen
sumber
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!

Brian Reinhold
sumber
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());
Alif
sumber
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.

Jim Blackler
sumber
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"/>
pratham kesarkar
sumber
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());
miragessee
sumber
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.

Vibhanshu Sharma
sumber
0
field.setInputType(InputType.TYPE_CLASS_TEXT);
Sailokesh Aithagoni
sumber