EditText için inputType'ı Programlı olarak mı ayarlıyorsunuz?


216

EditText için girdi türünü programlı olarak nasıl ayarlayabiliriz? Deniyorum:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

herhangi bir etkisi yok gibi görünüyor.

Yanıtlar:


213

TextView belgelerine göre , android: password'un programatik sürümü setInputType () değil , setTransformationMethod () yöntemidir. Yani şöyle bir şey:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

hile yapmalı.


4
Sadece buna eklemek için setInputType yerine setTransformationMethod öğesini çağırmanız gerekir. SetTransformationMethod öğesinden sonra setInputType öğesini çağırmak, EditText öğesinin tekrar parola modunda olmamasına neden olur.
Paul Ryland

11
bu cevap sorulan soru için yanlıştır. Bu, yalnızca girilen metni dönüştürür EditText(karakterleri parola noktalarıyla değiştirir). Bunun, EditTextkendisine girilmesine izin verilen şey üzerinde hiçbir etkisi yoktur .
slinden77

4
setInputType nihayetinde setTransformationMethod'u içeriden çağırır, bu nedenle setInputType için TYPE_TEXT_VARIATION_PASSWORD iletirseniz bunu sizin için yapar. Sorun setTransformationMethod null veya tek satır transformatörü ile çağıracak ve böylece parola transformatörünü temizleyecek setInputType çağrıldıktan sonra setSingleLine çağrısında ley gibi görünüyor.
sparkym3

sonra çağrı setTransformationMethod (PasswordTransformationMethod.getInstance ()) düzenleyemiyorum
sujith s

ancak alan tekrar kullanıldığında şifre önerilen metinde görünecektir
Gary Davies

409

EditText için girdi türünü programlı olarak ayarlamak için, girdi sınıfı türünün metin olduğunu belirtmeniz gerekir.

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

2
Senin ipucun benim için mükemmel çalıştı! Giriş türünü programlı olarak çok satırlı olarak ayarlamada benzer bir sorun yaşadım.
Anna Lam

Burada bitsel VEYA operatörüne sahip olmanın önemi nedir? Üzgünüm, android için yeniyim.
sanjeev

InputType.TYPE_TEXT_VARIATION_PASSWORD benim için çalışmıyor ama setTransformationMethod (PasswordTransformationMethod.getInstance ()); yapar!
Lluis Felisart

38

Standart klavyede gösterilen çeşitli Giriş Türleri.

giriş türleri demo

Giriş türünün programlı olarak ayarlanması

editText.setInputType(InputType.TYPE_CLASS_TEXT);

Bunun dışında diğer seçenekler TYPE_CLASS_TEXTde dokümanlarda bulunabilir .

XML'de giriş türünü ayarlama

<EditText
    android:inputType="text"
/>

Bunun dışında diğer seçenekler textde dokümanlarda bulunabilir .

Ek kod

Yukarıdaki görüntünün kodu şöyledir.

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

Ayrıca bakınız


29

hepsini çözdüm

.setInputType(InputType.TYPE_CLASS_NUMBER);

net verileri görmek ve

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

noktaları görmek için (veriler bir sayı ise, diğer sınıfta seçim değildir)


Bu işe yaradı, teşekkürler! Bir soru, neden düz metinden şifre türüne geçerken 'veya' eklemem gerekiyor? Neden bunu basitçe yapamıyorum: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD) ;? Denedim ve işe yaramadı.
UnknownUser

15

Yalnızca sayılara izin vermek için:

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

Parolayı dönüştürmek (gizlemek) için:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// TYPE _... 'yi ihtiyacınıza göre değiştirebilirsiniz.


5

Kotlin için:

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

4

Bu, benim gibi şifre ve serbest metin modu arasında geçiş yapmak isteyen başkalarına yardımcı olabilir. Önerilen giriş yöntemlerini kullanarak denedim ama sadece bir yönde çalıştı. Paroladan metne gidebilirim ama sonra geri dönemedim. Bir geçişi (ör. Parolayı göster onay kutusu) ele almaya çalışanlar

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

Ben kredi zorunda bu çözüm. Birkaç saat önce bulsaydım keşke!


1

Şifreyi göstermek için:

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

Şifreyi tekrar gizlemek için:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());

0

Bunu düzeninizdeki EditText / TextView etiketine eklemeyi deneyin

android:password="true"

Düzenleme: Ben sadece yazı yeniden okumak, belki de inşaat sonra bunu yapmak gerekir. Snippet'inizin neden işe yaramadığını anlamıyorum.


Bu durumda bir düzen dosyam yok, alanlar programlı olarak oluşturuluyor.
user246114

Evet inşaattan sonra yapılıyor, neden işe yaramadığından emin değilim!
user246114

6
bu seçenek artık kullanımdan kaldırıldı !!
swiftBoy

Bu şey sadece eski android 2.3 için çalışan biridir, cevabını iptal ettim.
djdance

0

Beklenen cevabın geldiğini biliyorum Java. Ama işte benim 2 sent her zaman XML(en az temel şeyler) görünümü ile ilgili şeyler ele çalışın, bu yüzden xmlbu kullanım durumunda işlemek yerine bir özellik kullanmak öneririzjava

    <EditText
     android:inputType="textPassword"/>

2
Bazı durumlarda farklı giriş türleri arasında geçiş yapmak isteyebilirsiniz, örneğin bir alana girilen şifreyi gizleme / gösterme; Bu sayfayı bana izin budur
William

1
ancak bunun için EditText'te kendi başınıza yapmanız gerekmeyen şifreyi göstermenize / gizlemenize izin veren bir seçenek de var.
pratham kesarkar

bilgi için teşekkürler, burada gördüm stackoverflow.com/a/41163578/3310235
William

0

Saklamak:

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

Göstermek:

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

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

ayrıca bu işlev çağrıldıktan sonra imlecin editText öğesinin başlangıç ​​noktasına hareket ettiğinden emin olmalısınız, bu yüzden imleci tekrar bitiş noktasına getirdiğinizden emin olun.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.