Android'de XML ile EditText'i düzenlenebilir hale nasıl getirebilirim?


300

Birisi bana EditTextXML üzerinden düzenlenebilir değil nasıl söyleyebilir ? Ben ayarlama çalıştı android:editableetmek false, ancak

  1. kullanımdan kaldırılmıştır; ve
  2. işe yaramadı.

6
Düzenlenebilir değilse, neden EditText'e ihtiyacınız var? Sıradan bir TextView kullanmak yeterli olmayacak mı? Ve setEditable () işlevi de kullanımdan kaldırıldı mı?
kiki

4
Bu benim için, içerikler için standart kopya yapıştırma özelliğini etkinleştirmek anlamlıdır. Bir TextView ile mümkün değildir (en azından varsayılan davranış değil)
Ixx

1
Düzeltme: Bu kötü bir fikir. Bazı durumlarda görünüm düzenlenebilir hale gelir veya kopyala yapıştırma seçenekleri artık gösterilmez. Başka bir yaklaşım arayacak.
Ixx

11
Benim durumumda, bir dizi işlem gerçekleştirirken bir EditText'i geçici olarak devre dışı bırakmak ve sonra işlem bittiğinde yeniden etkinleştirmek istiyorum.
Joe Plante

1
Bu soru meşru bir kaygı ile ilgilidir. EditTextStili korumak ve kaydırmaya izin vermek UI.setReadOnly(myEditText, true)için bu kitaplıktan kullanın . Kaynak kodda kontrol edebileceğiniz ayarlanması gereken birkaç özellik vardır .
Ocak

Yanıtlar:


399

Bu basit kodu kullanın:

textView.setKeyListener(null);

İşe yarıyor.

Düzenleme: Daha KeyListenersonra eklemek için aşağıdakileri yapın

1: anahtar dinleyicisini etiketlemek için ayarlayın textView

textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);

2: anahtar dinleyiciyi etiketten alın ve tekrar textView

textView.setKeyListener((KeyListener) textView.getTag());

30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); daha sonra textView.setKeyListener ((KeyListener) textView.getTag ()) ile yeniden ayarlayın;
Thomas Dignan

@TomDignan buna kolayca harika bir yol! Bir sorum var. Bu, herhangi bir şekilde KeyListener'ın ihtiyaç duyduğu varsayılan değerleri setFocusable()değiştirir mi?
Andy

afaik no, etiketi kullanabilmeniz için uygun olmalıdır
Thomas Dignan

Hey ur öneri bana yardımcı oldu .. teşekkürler
user1387035 28:12

38
Soru XML ile ayarlamakla ilgiliydi , bu neden çözüm olarak işaretlendi?
Denys Vitali

398

Bunu EditText xml dosyanıza ekleyin:

<EditText ...
        android:clickable="false" 
        android:cursorVisible="false" 
        android:focusable="false" 
        android:focusableInTouchMode="false">
</EditText>

Aynı etkiyi yapacak android:editable="false". Benim için çalıştı, umarım senin için de çalışır.


3
notes.setKeyListener (boş); notes.setClickable (yanlış); notes.setCursorVisible (yanlış); notes.setFocusable (yanlış); notes.setFocusableInTouchMode (yanlış);
Jack Franzen

3
XML'de yapmak istiyorsanız ... onunla TextView arasındaki fark ne olacak ???
Chris Sim

11
Fark şu şekilde kullanılabilir:TextInputLayout
ahmadalibaloch

2
Bu, soruda istendiği gibi saf bir XML çözümü olduğu için çözüm olarak işaretlenmelidir.
zgc7009

2
Bu onaylanmadı (Ekim 2018)
Sebastian Paduano

54

Edittext'iniz olsun

EditText editText;

editText.setKeyListener(null);

çalışacak ama sadece anahtarları dinlemiyor.

Kullanıcı düzenleme metninde bir imleç görebilir.

Deneyebilirsin editText.setEnabled(false);

Bu, kullanıcının imleci göremediği anlamına gelir. Basitçe söylemek gerekirse olacak TextView.


3
EditText bir TextView alt sınıfı olduğundan doğrudur. Ancak, lütfen editText öğesini textView yerine değişken olarak kullanın.
Joe Plante

@JoePlante Yapıcı yorum için teşekkürler değişken adı değiştirildi.
Mahendran

bu EditText'i grileştiriyor
stephen

Gri Düzenlenmiş Metin Düzenle, devre dışı olduğunu ve kullanıcının düzenlemeyi yapamayacağını belirtir.
Mahendran

Rengin ayarlanması ve aynı zamanda gri görünümün önlenmesi. XML: Android'i dene: textColor = "@ color / Black" android: etkin = "yanlış"
Kırmızı şarap

32

Diğer cevaplarda belirtildiği gibi, bunu yapabilirsiniz, setEnabled(false) ancak XML ile nasıl ayarlayacağınızı sorduğunuzdan, nasıl yapılacağı aşağıda açıklanmıştır.

Şu özelliği aşağıdaki özelliğe ekleyin EditText:

android:enabled="false"

4
OP sorusuna kesin cevap.
SMR

ancak bu yöntem kullanımdan kaldırıldı
Lalit kumar

2
@Lalitkumar enabledkullanımdan kaldırıldı. editabledır-dir.
InsanityOnABun

7
etkinleştirerek, tıklama dinleyicisine de erişemeyiz. benim için cevap bu değil.
Naveed Ahmad

Bu gizlemek metin :(
Chego

24

XML'den devre dışı bırak (bir satır):

 android:focusable="false"

gerekirse Java'dan yeniden etkinleştirin (ayrıca bir satır):

editText.setFocusableInTouchMode(true);

İyi cevap. Bu şekilde editText.setText'i ("metniniz") kullanarak editText değerini ayarlayabilirsiniz. Ancak kullanıcı bunu düzenleyemez.
Prakash

17

"Düzenlenebilir" kullanımdan kaldırıldı, ancak inputType'ta buna karşılık gelen bir çalışma sağlamadı.

Bu arada inputType = "none" herhangi bir etkisi var mı? Kullanmak ya da kullanmamak gördüğüm kadar fark yaratmaz.

Örneğin, varsayılan editText öğesinin tek satır olduğu söylenir. Ancak tek satır olması için bir inputType seçmeniz gerekir. Ve "none" seçeneğini seçerseniz, hala çok satırlıdır.


1
Bu bir fark yapmaz her cihazlarda, ancak gerektiği docs göre: developer.android.com/reference/android/widget/...
kow

12
Google karmaşasının güzel bir örneği
Yar

14

Bu kombinasyon benim için çalıştı:

<EditText ... >
    android:longClickable="false"
    android:cursorVisible="false"
    android:focusableInTouchMode="false"
</EditText>

13

Bahsettiğiniz gibi android: düzenlenebilir kullanımdan kaldırıldı. android: inputType = "none" yerine kullanılmalıdır, ancak bir hata nedeniyle çalışmaz ( https://code.google.com/p/android/issues/detail?id=2854 )

Ama aynı şeyi odaklanabilir kullanarak da elde edebilirsiniz.

XML ile:

<EditText ...
        android:focusable="false" 
</EditText>

Koddan:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);

Google'ın izniyle, hata iki farklı senaryoya düşecek: 1.) Düzeltilecek ancak 6 yıl sonra 2.) Asla düzeltilmeyecek, sadece Android'in yeni sürümünü geliştirecekler.
Neon Warge

12

tıklamak istiyor ancak düzenlemek istemiyorsanız şunları deneyin:

        android:focusable="false"

8

Sadece kullan android:enabled="false". Bu aynı zamanda EditTextdüzenlenebilir görünmeyecek bir görünüm verecektir .


7
<EditText
    android:id="@+id/txtDate"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="2dp"
    android:clickable="false"
    android:cursorVisible="false"
    android:gravity="center" />

ve aşağıdakileri kullanın:

txtDate.setKeyListener(null);

7

Java kodunda yapmak istiyorsanız, devre dışı bırakmak için bu satırı kullanın:

editText.setEnabled(false);

Ve bunu etkinleştirmek için:

editText.setEnabled(true);

5

Yapmaya çalıştım:

textView.setInputType( InputType.TYPE_NULL );

ki bu işe yarayacaktı ama benim için olmadı.

Bu kod ile bitirdim:

textView.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

    protected char[] getAcceptedChars() {
        return new char[] {};
    }
});

hangi mükemmel çalışır.


4

Bir etkinliğin EditText'e odaklanmamasını ve tıklandığında klavyeyi göstermemesini istediğimde, bu benim için işe yaradı.

Ana düzene öznitelik ekleme

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

ve sonra EditText alanı

android:focusable="false"
android:focusableInTouchMode="false"

İşte bir örnek:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_home"
    android:background="@drawable/bg_landing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    tools:context="com.woppi.woppi.samplelapp.HomeActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/fromEditText"
        android:layout_weight="1"
        android:hint="@string/placeholder_choose_language"
        android:textColor="@android:color/white"
        android:textColorHint="@android:color/darker_gray"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:onClick="onSelectFromLanguage" />

</RelativeLayout>

4
android:focusable="false"

android:clickable="false"

android:longClickable="false"

"LongClickable" özelliği, "Yapıştır" ve "Tümünü Seç" seçeneklerinin araç ipucu olarak görünmesine neden olan uzun basma eylemlerini devre dışı bırakır.


3

@Mahe madi'ye ek olarak bunu da deneyebilirsiniz

editText.setEnabled(false);
editor.setTextColor(Color.BLACK);

Bu yöntem imleci gizler, odağı kaybeder ve daha da önemlisi metin rengini TextView gibi davranan siyah olarak ayarlar.

Ve editText'e geri dönmek için, EditText'in tüm özelliklerini kazanmak için bunu yapın.

editText.setEnabled(true);

Umarım yardımcı olur :)


3

Kullanabilirsiniz android:editable="false"ama setEnabled(false)kullanıcıya kontrolün düzenlenemeyeceği konusunda görsel bir ipucu sağladığı için kullanmanızı tavsiye ederim . Aynı görsel işaret tüm engelli widget'lar tarafından kullanılır ve tutarlılık iyidir.


2

Aşağıdakileri denedim:

codeEditText.setInputType(InputType.TYPE_NULL);

this.codeEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

  @Override
  public void onFocusChange(View v, boolean hasFocus) {

    if (hasFocus) {

      pickCode();

    }

  }

});
this.codeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickCode();

  }

});

ancak sorun, düzenleme metni formdaki ilk metinse, odağı alır ve yeni bir etkinlik başlatan pickCode () kodunun hemen çağrılmasıdır. Bu yüzden kodu aşağıdaki gibi değiştirdim ve oldukça iyi çalışıyor gibi görünüyor (dışında metin düzenleme odağı ayarlayamıyorum ama gerek yok):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

Saygılarımla,

Yorumlarınızı bekliyoruz,

John Goche


1
İyi çalışıyor gibi görünüyor, ancak EditText gibi görünen TextView'i kullanmak daha kolay değil mi (using: style = "@ android: style / Widget.EditText")?
android geliştirici

2

EditText.setFocusable(false)Düzenlemek istersem yeniden true değerini kullanır ve ayarlar.



2

Bu şekilde benim için iş yaptı, seçebilir ve panoya kopyalayabilirim, ancak değiştiremiyorum veya yapıştıramıyorum.

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"

1

android: düzenlenebilir kullanımdan kaldırılmıştır, bunun yerine inputType kullanın.

   <EditText
        android:id="@+id/editText_x"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="70"
        android:inputType="none"
        android:hint="@string/enter_x" />

android: inputType = "none" android'den çok farklı: düzenlenebilir, kendiniz deneyin!
Denys Vitali

EditText'inizi düzenlenebilir hale getirmeyecekseniz, EditText kullanmak TextView widget'ını kullanmanızı öneririm, çünkü bu durumda EditText kullanmak anlamsızdır.
M-Razavi

Öneriniz, PopupWindow içeren bir EditText için geçerli değil , sorunu daha iyi anlamak için bu resme bakın . Bu örnekte bir EditText görünümünü istiyorum ama kullanıcı sadece popupwindow tarafından değeri değiştirmek için "kilitlemek" zorunda. Daha fazla motivasyon görmek için bu sorunu kontrol edin . Bu 2009'dan bu yana olan bir sorun.
Denys Vitali

1

Aynı sorun ile karşı karşıya kaldılar ama gözlem sonra bunu buldum android:editable="false"InputType (yalnızca çalışıyor android:inputType="ANY_VALUE") olduğu değil EditText verilen.

İnputType'ı EditText'ten kaldırın ve editable = false, onun iyi çalışıyor.


0

Bunu bir iletişim kutusu ile çözüyorum.

    AlertDialog dialog;
    EditText _editID;
    TextView _txtID;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        _txtID = (TextView) findViewById(R.id._txtID);
        dialog = new AlertDialog.Builder(this).create();
        _editID = new EditText(this);
        _editID.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
        dialog.setTitle("Numero do Registro:");
        dialog.setView(_editID);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "IR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                _txtID.setText(_editID.getText());
                toId(Integer.parseInt((_editID.getText().toString())));
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCELAR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        _txtID.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _txtID.setText("_editID.getText()");
                //_editID.setText("");
                dialog.show();

            }
        });



-10

Bu kodu deneyin. Projemde çalışıyor, bu yüzden projenizde çalışacak.

android:editable="false"

2
Bunun işe yaramadığını ve amortisman yönteminin daha fazla kullanılmasının önerilmediğini onaylayabilirim.
Adorjan Princz 8

1
android: alanın tıklanabilir olmasını ancak düzenlenebilir olmamasını istiyorsanız, yani tıkladıktan sonra bir iletişim kutusu açmak istiyorsanız düzenlenebilir aslında en iyi çözümdür.
Yar

projenizde çalıştığı için değil, bizimki üzerinde olacak. Çok zayıf düşünme.
Neon Warge
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.