Come rendere EditText non modificabile tramite XML in Android?


300

Qualcuno può dirmi come rendere un EditTextnon modificabile tramite XML? Ho provato a installare android:editablea false, ma

  1. è deprecato; e
  2. non ha funzionato.

6
Se non modificabile, perché dovresti aver bisogno di EditText? Non basta usare un normale TextView? E anche la funzione setEditable () è deprecata?
kiki,

4
Per me questo ha senso al fine di abilitare il copia incolla standard per i contenuti. Con TextView non è possibile (almeno non comportamento predefinito)
Ixx

1
Correzione: è una cattiva idea. In alcune circostanze la vista diventa modificabile o le opzioni di copia e incolla non vengono più visualizzate. Cercherà un altro approccio.
Ixx,

11
Nel mio caso, desidero disabilitare temporaneamente un EditText mentre viene eseguita una serie di operazioni, quindi riattivarlo al termine dell'operazione.
Joe Plante,

1
Questa domanda riguarda una preoccupazione legittima. Per preservare lo EditTextstile e consentire lo scorrimento, utilizzare UI.setReadOnly(myEditText, true)da questa libreria . Ci sono alcune proprietà che devono essere impostate, che puoi controllare nel codice sorgente .
Caw

Risposte:


399

Usa questo semplice codice:

textView.setKeyListener(null);

Funziona.

Modifica: per aggiungere in KeyListenerseguito, procedere come segue

1: imposta il listener chiave sul tag di textView

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

2: ottieni il listener chiave dal tag e ripristinalo su textView

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

30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); ripristinarlo più tardi con textView.setKeyListener ((KeyListener) textView.getTag ());
Thomas Dignan,

@TomDignan ottimo modo per farlo! Ho una domanda. Questo in qualche modo modifica i valori predefiniti richiesti da KeyListener, come setFocusable()perché il documento afferma che l'implementazione predefinita potrebbe essere modificata se modificata.
Andy,

afaik no, il tag dovrebbe essere disponibile per l'uso
Thomas Dignan,

Ehi, il tuo suggerimento mi ha aiutato ... grazie
user1387035

38
La domanda era sull'impostazione tramite XML , perché è contrassegnato come soluzione?
Denys Vitali,

398

Aggiungi questo al tuo file xml EditText:

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

Farà lo stesso effetto di android:editable="false". Ha funzionato per me, spero che funzionerà anche per te.


3
notes.setKeyListener (null); notes.setClickable (false); notes.setCursorVisible (false); notes.setFocusable (false); notes.setFocusableInTouchMode (false);
Jack Franzen,

3
Se vuoi farlo nell'XML ... quale sarà la differenza tra esso e TextView ???
Chris Sim,

11
La differenza è che può essere utilizzato conTextInputLayout
ahmadalibaloch

2
Questa dovrebbe essere contrassegnata come soluzione, in quanto si tratta di una soluzione XML pura come richiesto nella domanda.
zgc7009,

2
Questo è deprecato (ottobre 2018)
Sebastian Paduano il

54

Lascia che sia il tuo Edittext

EditText editText;

editText.setKeyListener(null);

funzionerà ma semplicemente non ascolterà i tasti.

L'utente può vedere un cursore sull'edittext.

Puoi provare editText.setEnabled(false);

Ciò significa che l'utente non può vedere il cursore. Dire semplicemente che diventerà TextView.


3
È corretto poiché EditText è una sottoclasse di TextView. Tuttavia, utilizzare editText come variabile anziché textView.
Joe Plante,

@JoePlante Nome variabile modificato grazie per un commento costruttivo.
Mahendran,

questo non fa che l'EditingText
stephen,

EditText in grigio indica che è disabilitato e l'utente non può modificarlo.
Mahendran,

L'impostazione del colore e impedirà l'aspetto grigio. XML: Prova android: textColor = "@ color / Black" android: enabled = "false"
Vino rosso

32

Come menzionato in altre risposte, puoi farlo setEnabled(false) ma poiché stai chiedendo come impostarlo tramite XML, ecco come farlo.

Aggiungi il seguente attributo al tuo EditText:

android:enabled="false"

4
risposta esatta alla domanda dei PO.
SMR

ma questo metodo è deprecato
Lalit kumar il

2
@Lalitkumar enablednon è deprecato. editableè.
InsanityOnABun

7
per abilitazione, non possiamo accedere anche al listener di clic. quindi per me non è la risposta.
Naveed Ahmad,

questo è il testo nascosto :(
Chego

24

disabilita da XML (una riga):

 android:focusable="false"

riattivare da Java, se necessario (anche una riga):

editText.setFocusableInTouchMode(true);

Buona risposta. In questo modo puoi comunque impostare il valore di editText usando editText.setText ("il tuo testo"). Ma l'utente non può modificarlo.
Prakash,

17

Hanno reso obsoleto "modificabile" ma non ne hanno fornito uno funzionante corrispondente in inputType.

A proposito, inputType = "none" ha qualche effetto? Usarlo o no non fa alcuna differenza per quanto vedo.

Ad esempio, il testo di modifica predefinito si dice che sia a riga singola. Ma devi selezionare un inputType affinché sia ​​una riga singola. E se selezioni "nessuno", è ancora multilinea.


1
Non fa differenza su tutti i dispositivi, ma dovrebbe , secondo la documentazione: developer.android.com/reference/android/widget/…
caw

12
Un bell'esempio di pasticcio di Google
Yar

14

Questa combinazione ha funzionato per me:

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

13

Come hai detto Android: modificabile è obsoleto. android: inputType = "none" dovrebbe essere usato invece ma non funziona a causa di un bug ( https://code.google.com/p/android/issues/detail?id=2854 )

Ma puoi ottenere la stessa cosa usando il focusable.

Tramite XML:

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

Dal codice:

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

Per gentile concessione di Google, il bug cadrà in due diversi scenari: 1.) Sarà risolto ma dopo 6 anni 2.) Non sarà mai risolto, svilupperanno semplicemente una nuova versione di Android.
Neon Warge,

12

se si desidera fare clic su di esso, ma non si desidera modificarlo, provare:

        android:focusable="false"

8

Basta usare android:enabled="false". Questo darà anche un aspetto al EditTextche lo renderà non modificabile.


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" />

e utilizzare quanto segue:

txtDate.setKeyListener(null);

7

Se vuoi farlo nel codice Java basta usare questa riga per disabilitarlo:

editText.setEnabled(false);

E questo per abilitarlo:

editText.setEnabled(true);

5

Ho provato a fare:

textView.setInputType( InputType.TYPE_NULL );

che dovrebbe funzionare, ma per me no.

Ho finito con questo codice:

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

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

che funziona perfettamente.


4

Quando voglio che un'attività non si concentri su EditText e non mostri la tastiera quando si fa clic, questo è ciò che ha funzionato per me.

Aggiunta di attributi al layout principale

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

e quindi il campo EditText

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

Ecco un esempio:

<?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>

3

Oltre a @mahe madi puoi provare anche questo

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

Questo metodo nasconde il cursore, perde lo stato attivo e, soprattutto, imposta il colore del testo sul nero, comportandosi come TextView.

E per tornare indietro a editText basta fare questo per ottenere tutte le proprietà di EditText.

editText.setEnabled(true);

Spero che sia d'aiuto :)


3

Potresti usare android:editable="false"ma ti consiglierei davvero di usare setEnabled(false)in quanto fornisce un indizio visivo all'utente che il controllo non può essere modificato. Lo stesso segnale visivo viene utilizzato da tutti i widget disabilitati e la coerenza è buona.


3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

L'attributo "longClickable" disabilita le azioni di stampa lunghe che fanno apparire le opzioni "Incolla" e o "Seleziona tutto" come descrizione comando.


2

Ho provato quanto segue:

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();

  }

});

ma il problema era che se il testo di modifica è il primo nel modulo, ottiene lo stato attivo e il codice pickCode () che avvia una nuova attività viene chiamato immediatamente. Quindi ho modificato il codice come segue e sembra funzionare abbastanza bene (tranne per il fatto che non riesco a focalizzare l'attenzione sulla modifica del testo ma non è necessario):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

I migliori saluti,

Commenti benvenuti,

John Goche


1
Sembra funzionare bene, ma non è più facile usare TextView che assomiglia a EditText (usando: style = "@ android: style / Widget.EditText")?
sviluppatore Android il

2

Uso EditText.setFocusable(false)e imposto di nuovo vero se voglio modificare.



2

In questo modo ha fatto il lavoro per me, posso selezionare e copiare negli appunti, ma non posso modificare o incollare.

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

1

android: modificabile è deprecato quindi usa inputType invece.

   <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" è molto diverso da android: modificabile, provalo tu stesso!
Denys Vitali,

Se hai intenzione di rendere EditText non modificabile, posso suggerire di utilizzare il widget TextView invece di EditText, poiché l'utilizzo di un EditText sembra in qualche modo inutile in quel caso.
M-Razavi,

Il tuo suggerimento non si applica per un EditText con una finestra popup, vedi questa immagine per capire meglio il problema. In questo esempio voglio l'aspetto di un EditText ma devo "bloccarlo" per consentire all'utente di modificare il valore solo dalla finestra popup. Controlla questo problema per vedere più motivazione. È un problema che esiste dal 2009.
Denys Vitali

1

Ho riscontrato lo stesso problema, ma dopo l'osservazione ho scoperto che android:editable="false"funziona solo quando inputtype ( android:inputType="ANY_VALUE") non lo è indicato in Edittext.

Rimuovi inputType da EditText e usa editable = false, funziona bene.


0

Lo risolvo con una finestra di dialogo.

    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();

            }
        });

0

Risposta breve: ho usato android:focusable="false"e ha funzionato. Anche l'ascolto con clic funziona ora.



-10

Prova questo codice. Funziona nel mio progetto, quindi funzionerà nel tuo progetto.

android:editable="false"

2
Posso confermare che questo non funziona e che inoltre non è consigliabile utilizzare il metodo deprezzato.
Adorjan Princz

1
android: modificabile è in realtà la soluzione migliore se si desidera che il campo sia cliccabile ma non modificabile, cioè per aprire una finestra di dialogo dopo aver fatto clic su di esso.
Anno

non perché funziona sul tuo progetto, lo farà sul nostro. Pensiero molto scarso.
Neon Warge,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.