Android'de EditText'i devre dışı bırakma


205

Uygulamamda, kullanıcının Yazma erişimi değil yalnızca Okuma erişimine sahip olduğu bir EditText var.

Kodda belirledim android:enabled="false".

EditText'in arka planı koyu olarak değişse de, üzerine tıkladığımda klavye açılıyor ve metni değiştirebiliyorum.

EditText'i devre dışı bırakmak için ne ayarlamalıyım?


2
Hem görünümün stilini hem de kaydırma davranışını korumak mümkündür. Bir devre dışı bırakmak için EditTextbu özelliklerini korurken, sadece kullanmak UI.setReadOnly(myEditText, true)gelen bu kütüphanede . Bu davranışı kitaplık olmadan çoğaltmak istiyorsanız, bu küçük yöntemin kaynak kodunu kontrol edin .
gak

Yanıtlar:


254

Doğru olanın ayarlanacağına inanıyorum android:editable="false".

Verdiğim bağlantıda noktası niteliklerini nedenini merak Ve eğer TextView, sen cevap çünkü EditTextdevralmıştır TextView:

EditText, kendisini düzenlenebilir olacak şekilde yapılandıran TextView üzerinde ince bir kaplamadır.

Güncelleme:
Aşağıdaki yorumlarda belirtildiği gibi editablekullanımdan kaldırılmıştır ( API seviyesi 3'ten beri ). Bunun yerine inputType(değer ile none) kullanmalısınız.


1
teşekkürler Nailuj, maalesef işe yaramadı. Öneri klavyenizi ekledikten sonra açılır ve metni değiştirme olanağı vardır.
Hesam

18
android: editable kullanımdan kaldırıldı. bunun yerine android: inputType = "none" kullanılmalıdır ancak hata içerir ve çalışmaz. Hepimizin soruna burada yıldız
eklesek iyi

88
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
Asimptote

30
android:editable="false" android:focusable="false"benim için harika çalışıyor (kullanımdan kaldırılanları unutun, sanırım android: editable'ın android: inputType ile ilgisi yok)
Muhammad Babar

9
Android: inputType = "none" çalışmayanlar için şunu deneyin: android: inputType = "none" ile android: focusable = "false"
Surendra Kumar

169

EditText.setFocusable(false) düzenlemeyi
EditText.setFocusableInTouchMode(true)etkinleştirmek için düzenlemeyi devre dışı bırakmak için kullanın ;


1
İşe yarıyor, ancak bu iyi bir uygulama değil çünkü görünüm düzenlenebilir gibi görünüyor ama yapamıyor. Benim için iyi çalıştı çünkü Görünümümün özel bir arka planı vardı, yani +1.
kaneda

4
@kaneda. Aslında bunu tercih ederim. Kutumun grileşmesini istemiyorum. :)
IAmGroot

1
Android 4.4'te bu seçenek orijinal metin rengini korur. Kullanmak editText.setEnabled(false);metin rengini griye çevirir. Bununla birlikte, döndürücüler kullanırken metin rengini değiştirmez ve setEnabledbu da onu tutarsız bir deneyim haline getirir.
tbraun

neden olmasın setFocusable(true)? setFocusable()ve arasındaki fark için bu bağlantıya bakın setFocusableInTouchMode(): stackoverflow.com/questions/23799064/…
kenju

Bu gerçekten ihtiyaçlarıma uyuyor. İçinde EditText bulunan bir bileşik özel görünüm oluşturdum. Özel görünümümü yalnızca tıklamaları kabul edecek, ancak bu bir tarih seçici iletişim kutusu başlattığı için düzenlenemez hale getirme konusunda sorun yaşıyorum. Bu çözüm, onClickListeners'ı devre dışı bırakmadığı için çalışır
Neon Warge

66

Aşağıdaki yöntemi deneyebilirsiniz:

 private void disableEditText(EditText editText) {
    editText.setFocusable(false);
    editText.setEnabled(false);
    editText.setCursorVisible(false);
    editText.setKeyListener(null);
    editText.setBackgroundColor(Color.TRANSPARENT); 
 }

Etkin Metin Düzenleme:

Etkin Metin Düzenleme

Devre Dışı EditText:

Devre Dışı EditText

Benim için çalışıyor ve umarım sana yardımcı olur.


1
Bu bir TextView'a benziyor. Bu inanılmaz. Aradığım bu.
Yunus Haznedar

5
Birisinin geri etkinleştirmeyle aynı sorunu olması durumunda - editText.setFocusableInTouchMode(true)yerine aramanız gerekir editText.setFocusable(true).
Dart Dega

64

Kullanıcı girişini devre dışı bırakmak için bunu kullanın

android:focusable="false"

android: editable = "false" Bu yöntem kullanımdan kaldırılmıştır.


1
Kabul edilen cevap bu olmalıdır. Diğer yanıtlarda önerildiği gibi giriş türünü "yok" olarak ayarlamak (her zaman) işe yaramaz. 'Yanlış' olarak etkinleştirilen ayar, düzenlemeyi önler ancak istenebilecek veya istenmeyebilecek metni de karartır.
jerry

40

Düzenlemeyi devre dışı bırakmak EditTextiçin focusable OR kullanabiliriz enableama

  1. android:enabled=...Veya kullanmaeditText.setEnabled(...)

    Ayrıca değişir metin rengini EditTextgri için.
    Tıklandığında hiçbir etkisi olmaz

  2. Kullanarak android:focusable=...veya editText.setFocusable(false)-editText.setFocusableInTouchMode(true)

    Bu değişmez bir metin rengini EditText
    o vurgular tıklandığında EditTextkaç milisaniye hakkında alt satırında

Çıktı

görüntü açıklamasını buraya girin


Bu görünüme dokunurken geçici vurguyu kaldırmak için android:longClickable="false"ile birlikte ekleyebilirsiniz android:focusable="false". Bu aynı zamanda "tümünü seç" açılır penceresinin görünmesini de engeller.
CzarMatt

19

Belirtildiği gibi android:editable="false", InputType TYPE_NULL öğesini EditText üzerinde kullanabilirsiniz.

bunun gibi kullanın:

editText.setInputType(InputType.TYPE_NULL);

1
Alandaki onClickListener'ı devre dışı bırakmadığı için bu yanıtı beğendim.
Harsh Ganatra

inputType parolaysa ne yapmalı? TYPE_NULL, parolayı görünür kılar.
ilyamuromets

17

Kullanımdan android:editable="false"kaldırıldığı gibixml

Kullanımı android:enabled="false"basit. Neden daha fazla kod kullanmalı?

İsterseniz bunu java classprogramlı olarak da kullanabilirsiniz.

 editText.setEnabled(false);

android'i kullan: etkinleştirildi = "true" için etkinleştirin
android_jain

8

Basitçe:

editText.setEnabled(false);

1
Önceki cevaptan nasıl farklıdır (soru olarak)?
Onik

setFocusable (false) ayrıca bir OnClickListener ayarlamanıza izin verir.
Oded Breiner

5

Sınıfta aşağıdaki özellikleri ayarlayın:

editText.setFocusable(false);
editText.setEnabled(false);

Gerektiği gibi sorunsuz çalışacaktır.


sadece enabledyeterliydi
ateebahmed

5

Bir EditText işlevselliğini devre dışı bırakmak için şunu kullanın:

EditText.setInputType(InputType.TYPE_NULL);

bir şekilde etkinleştirmek istemeniz durumunda şunları kullanabilirsiniz:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

inputType parolaysa ne yapmalı? TYPE_NULL, parolayı görünür kılar.
ilyamuromets

5

Google'ın yeni çıkan Materyal Tasarım Kitaplığını kullanıyorum. Benim durumumda, android: focusable = "false" ve android: cursorVisible = "false" kullandığımda çalışıyor

<com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/to_time_input_layout"
                    app:endIconMode="custom"
                    app:endIconDrawable="@drawable/ic_clock"
                    app:endIconContentDescription="ToTime"
                    app:endIconTint="@color/colorAccent"
                    style="@style/OutlinedEditTextStyle"
                    android:hint="To Time">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/to_time_edit_text"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:focusable="false"
                        android:cursorVisible="false" />

</com.google.android.material.textfield.TextInputLayout>

4

kullanıyorsanız android:editable="false", eclipse size "android: editable kullanımdan kaldırıldı: Bunun yerine inputType kullanın" mesajını hatırlatacaktır.

Yani, android:focusable="false"bunun yerine kullanıyorum, benim için iyi çalıştı.


4
android:editable="false"

artık kullanımdan kaldırıldı ve kullanılıyor

 YourEditText.setInputType(InputType.TYPE_NULL);

inputType parolaysa ne yapmalı? TYPE_NULL, parolayı görünür kılar.
ilyamuromets

@ilyamuromets Bu yanıt stackoverflow.com/a/16720520/7704650 ile yardımcı olabilir TYPE_TEXT_VARIATION_PASSWORDDaha fazla developer.android.com/reference/android/text/InputType
emkarachchi

Yazılım klavyesi açıkken ve kullanıcı metin girmeye çalışırken EditText'teki girişi devre dışı bırakmak istiyorum. InputType.TYPE_NULL, isFocusable ve isFocusableInTouchMode ile yanlış değerde harika çalışıyor. Ancak, girdi alanının inputType öğesi textPassword ise, InputType.TYPE_NULL parola değerini görünür kılar. InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD daha sonra şifre de görünür hale gelir ve kullanıcı metin girebilir.
ilyamuromets

4

Devre Dışı Bırak = ODAK + TIKLAMA + İMLEÇ

Odağı, tıklamayı ve imleç görünürlüğünü devre dışı bırakmak benim için hile yapıyor.

İşte XML'deki kod

<EditText
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:cursorVisible="false"
    android:clickable="false"
    />


3

Bu edittext'inizi devre dışı bırakacaktır .

editText.setEnabled(false);

Ve bunu kullanarak

editText.setInputType(InputType.TYPE_NULL);

Edittext'inizin yazılım klavyenizi göstermemesini sağlar, ancak fiziksel bir klavyeye bağlıysa yazmanıza izin verir.


inputType parolaysa ne yapmalı? TYPE_NULL, parolayı görünür kılar.
ilyamuromets

1

Benim durumumda, EditTexteğer hayır ise metni kaydırmam gerekiyordu . maxLinesdevre dışı bırakıldığında satır sayısı aşıyor . Bu uygulama benim için mükemmel çalıştı.

private void setIsChatEditTextEditable(boolean value)
{
    if(value)
    {
        mEdittext.setCursorVisible(true);
        mEdittext.setSelection(chat_edittext.length());
       // use new EditText(getApplicationContext()).getKeyListener()) if required below
        mEdittext.setKeyListener(new AppCompatEditText(getApplicationContext()).getKeyListener());  
    }
    else
    {
        mEdittext.setCursorVisible(false);
        mEdittext.setKeyListener(null);
    }
}

1

Bunu dene, benim için iyi çalışıyor:

public class CustomEdittext extends EditText {

Boolean mIsTextEditor=true;
public CustomEdittext(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

@Override
public boolean onCheckIsTextEditor() {
    // TODO Auto-generated method stub
    return mIsTextEditor;
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    mIsTextEditor=false;
    Boolean mOnTouchEvent=super.onTouchEvent(event);
    mIsTextEditor=true;     
    return mOnTouchEvent;
} }

Not: this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); Aktivitenizi eklemeniz gerekir, aksi keyboardtakdirde ilk kez açılır .


1

Bazı yanıtların da belirttiği gibi, editText'i devre dışı bırakırsanız gri olur ve odaklanabilirliği false olarak ayarlarsanız imleç görüntülenir.

Bunu sadece xml ile yapmak istiyorsanız hile yaptı

       <YourFloatLabel
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

            <EditText
                android:id="@+id/view_ads_search_select"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusable="true"
                android:clickable="true"/>  
       </YourFloatLabel>

Sadece editText'in üstüne bir FrameLayout ekliyorum ve odaklanabilir ve tıklanabilir olarak ayarlıyorum, böylece editText tıklanamaz.


0

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

android: focusable = "false"


2
Bu, Sampath Kumar'ın 4 yıl önce yayınladığından ne açıdan farklı?
gobrewers 14

0

@ Asymptote'un kabul edilen cevap hakkındaki yorumundan, şunu kullanın:

myEditText.setEnabled(false);
myEditText.setInputType(InputType.TYPE_NULL);

... ve Bob senin amcan.


0

Bugün hala kullanıyorum editable="false", ama aynı zamanda focusable="false".

Bence bir EditText'i düzenlenemez hale getirmemiz gereken durum, EditText stilini (o altı çizili, ipucu vb.) Korumak istememiz, ancak metin yerine diğer girdileri kabul etmesidir. Örneğin bir açılır liste.

Böyle bir kullanım durumunda, EditTexttıklanabilirliğe sahip olmamız gerekir (bu nedenle enabled="false"uygun değildir). Ayar focusable="false"bu numarayı yapıyor, ancak yine de EditText'i uzun süre tutabilir ve kendi metnimi panodan üzerine yapıştırabilirim . Kodunuza ve kullanımınıza bağlı olarak bu, uygulamanızı bile kilitleyebilir.

Ben de kullandım editable="false"ve şimdi uyarı dışında her şey harika.


0

kullanabilirsiniz android:focusable="false"ancak imleci devre dışı bırakmanız gerekir, aksi takdirde kopyala / yapıştır işlevi yine de çalışır.

yani, kullan

android:focusable="false"
android:cursorVisible="false"

0

Birden fazla engel düzeyine nasıl ulaşılacağı konusunda birden çok şey vardır.

  • editText.setShowSoftInputOnFocus(false); ve editText.setFocusable

EditTextbazı metinlerde klavyenin görünmesini engeller . Ancak imleç hala görünür durumda ve kullanıcı bazı metinleri yapıştırabilir.

  • editText.setCursorVisible(false)

imleci gizler. Bunu neden yapmak isteyeceğinden emin değilim. Kullanıcı metin girip yapıştırabilir.

  • editText.setKeyListener(null)

Bu yolu en uygun buluyorum. Kullanıcının nasıl metin girebileceğinin bir yolu yoktur, ancak OnClickListenerkullanıcı dokunduğunda eylemi tetiklemek istiyorsanız widget yine de çalışır .

  • editText.setEnabled(false);

tamamen devre dışı bırakır EditText. Kelimenin tam anlamıyla 'salt okunurdur', kullanıcı içine herhangi bir metin giremez ve (örneğin) OnClickListener onunla çalışmaz.

TextEdit belgeleri


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.