EditText Salt Okunur Yap


119

Salt okunur bir EditTextgörünüm yapmak istiyorum . Bu kodu yapacak XML öyle görünüyor android:editable="false", ancak bunu kodda yapmak istiyorum.

Bunu nasıl yapabilirim?



3
Bunun için android:editablekullanımdan kaldırıldığını da belirtmek gerekir EditText.
Derek W

Bunu yapmanın en güvenilir yolu kullanıyor UI.setReadOnly(myEditText, true)gelen bu kütüphanede . Kaynak kodunda kontrol edebileceğiniz ayarlanması gereken birkaç özellik vardır .
gak

3
Evet Derek haklı. Şimdi XML kullanmanız gereken android:inputType="none"veandroid:textIsSelectable="true"
Atul

Yanıtlar:


135

Lütfen bu kodu kullanın ..

Edittext.setEnabled(false);

34
bu sadece salt okunur 'ayarlamakla kalmaz, aynı zamanda kaydırmayı ve kopyalamayı da devre dışı bırakır :-(
josef

1
Bu devre dışı bırakır. Özellikle çok satırlı EditText için faydasız.
Atul

bunu dene ama değer mi kaybettin?
fdurmus77

97

Eğer setEnabled(false)öyleyse, editTextdevre dışı (gri vb.) Görünecektiniz. Editörünüzün görsel yönünü değiştirmek istemeyebilirsiniz.

Daha az müdahaleci bir yol kullanmak olacaktır setFocusable(false).

Bunun sorunuzu başlangıçtaki niyetinize daha yakın yanıtladığına inanıyorum.


8
Bu iyidir, ancak kullanıcı yine de metin alanına "Yapıştır" yapabilir.
xtrem

14
Bu benim için harika çalıştı. SetEnabled (false) özelliğini kullanamadığım için tıklanabilir olması gerekiyordu. Yapıştırılabilir sorunu aşmak için android: longClickable = "false"
dt0

3
Eğer kullanırsanız setFocusable(false)(ve hatta setFocusableInTouchMode(false)birlikte setClickable(false)) hala senin değerini değiştirebilir editTextBasın ile editTextbir için birkaç yüz milisaniye seçerek Pastesürece seçeneği sistem panosu boş. Mevcut en yeni API olan 23 ile test ettim .
patryk.beza

Bu çalışıyor, kaydırabiliyorum ve imleci göremiyorum.
live-love

28

In XMLKullanım:

android:editable="false"

Örnek olarak:

<EditText
    android:id="@+id/EditText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:editable="false" />

Javadoc'a göre , editableözellik kullanımdan kaldırılmış görünmüyor (en azından API seviyesi 23'ten itibaren).
Greg Brown

8
@MichelJung haklı. kullanmalısınandroid:inputType="none"
Ata Iravani

1
Soru, XML aracılığıyla değil Java kodu aracılığıyla düzenlenebilir yanlış yapmanın bir yolunu arıyor!
saeed khalafinejad

7
Deniyorum android:inputType="none"ve veriler hala düzenlenebilir durumda.
BlueMonkMN

24

Bu benim için çalışıyor:

EditText.setKeyListener(null);

5
Bu iyi olurdu, ancak kullanıcı yine de alana "yapıştırabilir". Bu bir hile gibi görünse de, yine de başparmak yukarı. Keşke bir setEditable () API'si olsaydı.
xtrem

15

En iyisi TextViewbunun yerine kullanmaktır.


8
uygulama akışına göre bazen onu düzenlenebilir hale getirmesi gerekebilir, diğerlerinde olmayabilir
Muhammed Refaat

15
editText.setInputType(InputType.TYPE_NULL);

Gereğince docs bu görüntülenmesini yumuşak klavye engeller. Ayrıca yapıştırmayı önler, kaydırmaya izin verir ve görünümün görsel yönünü değiştirmez. Ancak bu aynı zamanda görünüm içindeki metnin seçilmesini ve kopyalanmasını da engeller.

Benim testleri ayarlamasını setInputTypeiçin TYPE_NULLamorti fonksiyonel olarak görünmektedir android:editable="false". Ek olarak, android:inputType="none"gözle görülür bir etkisi yok gibi görünüyor.


Kabul ediyorum, bu şimdilik çalışıyor ve dediğin gibi android:inputType="none"artık çalışmıyor.
Goke Obasa

1
Ne yazık ki bu, sanal klavye zaten açıksa alana yazmayı engellemez (yani kullanıcı önce düzenlenebilir bir alana dokunur, sonra bu tek sanal klavye kapanmaz). Ayrıca harici bir klavyeden alana yazmayı engellemez.
jk7

11

android: editable = "false" kullanımdan kaldırıldı. Bu nedenle, düzenleme metnini salt okunur yapmak için kullanamazsınız.

Bunu aşağıdaki çözümü kullanarak yaptım. Burada kullandım

android: InputType = "none"

android: textIsSelectable = "true"

android: odaklanabilir = "false"

Deneyin ver :)

<EditText
         android:id="@+id/et_newsgpa_university"
         android:layout_height="wrap_content"
         android:layout_width="match_parent"
         android:hint="@string/hint_educational_institute"
         android:textSize="@dimen/regular_text"
         android:inputType="none"
         android:textIsSelectable="true"
         android:focusable="false"
         android:maxLines="1"
         android:imeOptions="actionNext"/>

Gerçekte salt okunur değildir, bu koddaki edittext'e yine de değerleri yapıştırabilirsiniz. android:enabled="false"iyi bir alternatif olabilir.
eVader

7
editText.setEnabled(false);
editText.setFilters(new InputFilter[] { new InputFilter() {
    public CharSequence filter(CharSequence src, int start, int end,
            Spanned dst, int dstart, int dend) {
        return src.length() < 1 ? dst.subSequence(dstart, dend) : "";
    }
} });

Bu size düzenlenemez EditText filtresi verecektir. önce istediğiniz metni editText alanına koymanız ve ardından bu filtreyi uygulamanız gerekir.


2
İyi bir çözüm ve TextWatcher'dan daha az kod satırı. Bu, kullanıcının metni seçip kopyalamasına izin verir, ancak yazarak veya KES veya YAPIŞTIR yoluyla metni değiştiremez. Dönüş ifadesi şu şekilde basitleştirilebilirreturn dst.subSequence(dstart, dend);
jk7

Önceki yorumum, EditText alanını devre dışı bırakmadan sadece setFilters () ifadesine atıfta bulunuyordu.
jk7

Teşekkürler, benim için işe yarayan tek çözüm bu! Çalışan bir şeyin değerinin düşürülmesi ve hala çalışmayan ve istenmeyen yan etkiye sahip (çok satırlı girdi) bir şeyle (inputType = "none") değiştirilmesi sinir bozucudur. Lütfen @ jk7 tarafından önerilen değişikliğin hayati önem taşıdığını unutmayın, çünkü orijinal dönüş ifadesiyle, orijinal metninizin bir bölümünü seçip bir şeyler yazarsanız, seçilen metni filtrenin döndürdüğü boş dizeyle değiştirirsiniz. Bu durumda src uzunluğu sıfır değildir ve boş dizge etkindir.
Paul L

6

bu iki satırı yazmak işiniz için fazlasıyla yeterli.

yourEditText.setKeyListener(null); 
yourEditText.setEnabled(false);

Dinleyiciyi devre dışı bırakmaktan çok daha yararlıdır.
Humberto Castañeda


3

Kullanmayı dene

editText.setEnabled(false);
editText.setClickable(false);

Bu hala klavyeden sekmeye basarak odaklanılabilmesine izin veriyor
AlanKley

3
android:editable

Ayarlanırsa, bunun TextViewbir giriş yöntemi olduğunu belirtir . Aksi belirtilmedikçe metinsel olacaktır. Çünkü TextViewbu varsayılan olarak yanlıştır. Çünkü EditTextvarsayılan olarak doğrudur.

Veya bir booleandeğer olmalıdır .truefalse

Bu aynı zamanda , bu türden bir değeri içeren bir kaynağa (formda @[package:]type:name) veya tema niteliğine ( formda ) bir referans olabilir ?[package:][type:]name.

Bu, düzenlenebilir genel öznitelik kaynak sembolüne karşılık gelir.

İlgili Yöntemler


2

İçerik menüsünü kaldırmak için düzenleme metninin onLongClick dinleyicisini geçersiz kılmayı deneyin:

EditText myTextField = (EditText)findViewById(R.id.my_edit_text_id);
myTextField.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        return true;
    }
});

3
Android: editable = "false" ve android: focusable = "false" kullandım, ardındanLongclick'te geçersiz kıldım ve istediğim sonucu aldım
JannGabriel

2

Bu kodu kullanın:

editText.setEnabled(false);
editText.setTextColor(ContextCompat.getColor(context, R.color.black);

Devre dışı bırakılması editTextbir verir salt okunur görünüm ve davranış değil, aynı zamanda değişir text-coloronun metin rengi gereklidir ayarı böylece gri.


Lütfen bazı açıklamalar da ekleyin.
Kara

1

bu benim uygulamam (biraz uzun ama benim için faydalı!): Bu kodla EditView Salt Okunur veya Normal yapabilirsiniz. salt okunur durumda bile metin kullanıcı tarafından kopyalanabilir. normal bir EditText'ten farklı görünmesi için arka planı değiştirebilirsiniz.

public static TextWatcher setReadOnly(final EditText edt, final boolean readOnlyState, TextWatcher remove) {
    edt.setCursorVisible(!readOnlyState);
    TextWatcher tw = null;
    final String text = edt.getText().toString();
    if (readOnlyState) {
            tw = new TextWatcher();

            @Override
            public void afterTextChanged(Editable s) {

            }
            @Override
            //saving the text before change
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            // and replace it with content if it is about to change
            public void onTextChanged(CharSequence s, int start,int before, int count) {
                edt.removeTextChangedListener(this);
                edt.setText(text);
                edt.addTextChangedListener(this);
            }
        };
        edt.addTextChangedListener(tw);
        return tw;
    } else {
        edt.removeTextChangedListener(remove);
        return remove;
    }
}

bu kodun yararı, EditText'in normal EditText olarak görüntülenmesi, ancak içeriğin değiştirilememesidir. Dönüş değeri, salt okunur durumdan normale dönebilmek için değişken olarak tutulmalıdır.

EditText'i salt okunur yapmak için şu şekilde koyun:

TextWatcher tw = setReadOnly(editText, true, null);

ve normal yapmak için önceki ifadeden tw kullanın:

setReadOnly(editText, false, tw);

1

Bu, yukarıdaki önerilerin birkaçını dikkate alarak benim için çalıştı. TextEdit'i odaklanabilir hale getirir, ancak kullanıcı tıklarsa veya odaklanırsa, PopupWindow'da bir seçim listesi gösteririz. (Tuhaf Spinner widget'ını değiştiriyoruz). TextEdit xml çok geneldir ...

public void onCreate(Bundle savedInstanceState) {
    ....  
    fEditState = (EditText) findViewById(R.id.state_edit);

    fEditState.setLongClickable(false);
    fEditState.setKeyListener(null);
    fEditState.setFocusable(true);

    fEditState.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus)
        {
            if (hasFocus)
            {
               showStatesPopup();

            }
        }
    });

    fEditState.setOnClickListener(new Button.OnClickListener(){

        public void onClick(View arg0)
        {
           showStatesPopup();
        }
    });
    ....
}

private void showStatesPopup()
{
    // fPopupWindowStates instantiated in OnCreate()

    if (!fPopupWindowStates.isShowing()) {
        // show the list view as dropdown
        fPopupWindowStates.showAsDropDown(fEditState, -5, 0);
    }
}  

1

Sadece kontrol metin kopyalamak mümkün ama bir kullanmak isteyebilirsiniz düzenlemek mümkün olmayacaktır istiyorsanız TextView yerine ve set metin olduğunu seçilebilir .

kod:

myTextView.setTextIsSelectable(true);
myTextView.setFocusable(true);
myTextView.setFocusableInTouchMode(true);
// myTextView.setSelectAllOnFocus(true);

xml:

<TextView
    android:textIsSelectable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"     
    ...
/>
<!--android:selectAllOnFocus="true"-->


SetTextIsSelectable dokümantasyonu şunu söylüyor:

TextIsSelectable değerini ayarlamak için bu yöntemi çağırdığınızda, odaklanabilir, focusableInTouchMode, tıklanabilir ve longClickable bayraklarını aynı değere ayarlar ...

Ancak, dokunma girdisiyle çalışmasını sağlamak için odaklanabilir ve odaklanabilirInTouchMode'u açıkça true olarak ayarlamak zorunda kaldım.


1

Bu benim için tek tam basit çözümdü.

editText.setEnabled(false);   // Prevents data entry
editText.setFocusable(false); // Prevents being able to tab to it from keyboard

0

Şunları kullanarak EditTextPreference salt okunur yapmakta hiçbir sorun yaşamadım:

editTextPref.setSelectable(false);

Bu, salt okunur alanları görüntülemek için 'özet' alanının kullanılmasıyla birleştirildiğinde iyi çalışır (örneğin, hesap bilgilerini görüntülemek için kullanışlıdır). Http://gmariotti.blogspot.com/2013/01/preferenceactivity-preferencefragment.html adresinden dinamik olarak alınan özet alanlarının güncellenmesi

private static final List<String> keyList;

static {
    keyList = new ArrayList<String>();
    keyList.add("field1");
    keyList.add("field2");
    keyList.add("field3");
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);

    for(int i=0;i<getPreferenceScreen().getPreferenceCount();i++){
        initSummary(getPreferenceScreen().getPreference(i));
    }
}

private void initSummary(Preference p) {
    if (p instanceof PreferenceCategory) {
        PreferenceCategory pCat = (PreferenceCategory) p;
        for (int i = 0; i < pCat.getPreferenceCount(); i++) {
            initSummary(pCat.getPreference(i));
        }
    } else {
        updatePrefSummary(p);
    }
}

private void updatePrefSummary(Preference p) {
    if (p instanceof ListPreference) {
        ListPreference listPref = (ListPreference) p;
        p.setSummary(listPref.getEntry());
    }
    if (p instanceof EditTextPreference) {
        EditTextPreference editTextPref = (EditTextPreference) p;
        //editTextPref.setEnabled(false); // this can be used to 'gray out' as well
        editTextPref.setSelectable(false);
        if (keyList.contains(p.getKey())) {
            p.setSummary(editTextPref.getText());
        }
    }
}

0

Bunu EdiTextView xml dosyasında ayarlayın

android:focusable="false"

1
Soru, XML'de değil, programlı olarak nasıl salt okunur yapılacağını sorar.
jk7

0

Kullanımdan android:editable=""kaldırıldığı gibi,

Ayar

  • android:clickable="false"
  • android:focusable="false"
  • android:inputType="none"
  • android:cursorVisible="false"

"salt okunur" hale getirecek.

Ancak kullanıcılar yine de alana yapıştırabilir veya diğer uzun tıklama eylemlerini gerçekleştirebilir. Bunu devre dışı bırakmak için onLongClickListener () öğesini geçersiz kılmanız yeterlidir.
Kotlin'de:

  • myEditText.setOnLongClickListener { true }

yeterli.


0

Bu konudaki yaklaşımım, aşağıdaki gibi özel bir TextWatcher sınıfı oluşturmaktır:

class ReadOnlyTextWatcher implements TextWatcher {
    private final EditText textEdit;
    private String originalText;
    private boolean mustUndo = true;

    public ReadOnlyTextWatcher(EditText textEdit) {
        this.textEdit = textEdit;
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if (mustUndo) {
            originalText = charSequence.toString();
        }
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (mustUndo) {
            mustUndo = false;
            textEdit.setText(originalText);
        } else {
            mustUndo = true;
        }
    }
}

Ardından, bu izleyiciyi, etkinleştirilmesine rağmen yalnızca okunmasını istediğiniz herhangi bir alana ekleyin:

editText.addTextChangedListener(new ReadOnlyTextWatcher(editText));
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.