web-dev-qa-db-fra.com

Rendre EditText en lecture seule

Je souhaite créer une vue EditText en lecture seule. Le XML pour faire ce code semble être Android:editable="false", mais je veux le faire en code. 

Comment puis-je faire ceci?

99
warna

S'il vous plaît utiliser ce code ..

Edittext.setEnabled(false);
116
Nikhil

Si vous setEnabled(false), votre editText semblerait désactivé (gris, etc.). Vous voudrez peut-être pas changer l'aspect visuel de votre éditeur. 

Une méthode moins intrusive consisterait à utiliser setFocusable(false).

Je crois que cela répond à votre question plus près de votre intention initiale.

90
user962247

En XML use

Android:editable="false"

Exemple:

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

Cela fonctionne pour moi:

EditText.setKeyListener(null);
20
igorinov

Le mieux est d'utiliser TextView à la place.

14
Egor
editText.setInputType(InputType.TYPE_NULL);

Comme indiqué dans docs , ceci empêche l’affichage du clavier virtuel. Il empêche également le collage, permet le défilement et ne modifie pas l'aspect visuel de la vue. Toutefois, cela empêche également la sélection et la copie du texte dans la vue.

De mes tests, régler setInputType sur TYPE_NULL semble être fonctionnellement équivalent au Android:editable="false" déprécié. De plus, Android:inputType="none" ne semble pas avoir d'effet notable.

10
Adrian Toman
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) : "";
    }
} });

Cela vous donnera un filtre EditText non éditable. vous devez d’abord placer le texte souhaité dans le champ editText, puis appliquer ce filtre.

7
DArkO

défini en XML

Android:inputType="none" 
5
Jitendra Surve

écrire ces deux lignes est plus que suffisant pour votre travail.

yourEditText.setKeyListener(null); 
yourEditText.setEnabled(false);
5
Vishal Pandey

Essayez d'utiliser

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

Android: editable = "false" a été amorti. Par conséquent, vous ne pouvez pas l'utiliser pour rendre le texte modifié en lecture seule. 

J'ai fait cela en utilisant la solution ci-dessous. Ici j'ai utilisé 

Android: inputType = "none"  

Android: textIsSelectable = "true"  

Android: focusable = "false"

Essayez-le :)

<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"/>
4
Android:editable

Si défini, spécifie que cette TextView a une méthode d'entrée. Ce sera un texte sauf indication contraire. Pour TextView, c'est false par défaut. Pour EditText, il est vrai par défaut.

Doit être une valeur boolean, soit true ou false.

Cela peut également être une référence à une ressource (sous la forme @[package:]type:name) ou à un attribut de thème (sous la forme ?[package:][type:]name) contenant une valeur de ce type.

Cela correspond au symbole de ressource d'attribut global modifiable.

Méthodes connexes

3
jclafuente

Essayez de remplacer l'écouteur onLongClick du texte à supprimer pour supprimer le menu contextuel:

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

voici mon implémentation (un peu longue, mais utile pour moi!): Avec ce code, vous pouvez rendre EditView en lecture seule ou normal. même en lecture seule, le texte peut être copié par l'utilisateur. vous pouvez modifier le fond pour le rendre différent d’un EditText normal.

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

l'avantage de ce code est que EditText est affiché comme un EditText normal mais que le contenu n'est pas modifiable. La valeur de retour doit être conservée en tant que variable pour pouvoir revenir à l'état normal en lecture seule. 

pour créer un EditText en lecture seule, il suffit de le mettre comme suit:

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

et pour le rendre normal, utilisez tw de la déclaration précédente:

setReadOnly(editText, false, tw);
1
Ali sh

Cela a fonctionné pour moi, en prenant en compte plusieurs des suggestions ci-dessus. Permet de mettre au point TextEdit, mais si l'utilisateur clique ou fait la mise au point, nous affichons une liste de sélections dans une fenêtre contextuelle. (Nous remplaçons le widget Wacky Spinner). TextEdit XML est très générique ... 

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
Johnny O

Utilisez ce code:

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

La désactivation de editText donne un aspect et un comportement en lecture seule, mais modifie également la couleur du texte en gris, il est donc nécessaire de définir sa couleur. 

1
Mary Garcia

Si vous voulez simplement pouvoir copier du texte à partir du contrôle mais ne pas pouvoir l'éditer, vous pouvez utiliser plutôt un TextView et définir text à selectable.

code:

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


La documentation de setTextIsSelectable dit: 

Lorsque vous appelez cette méthode pour définir la valeur de textIsSelectable, les indicateurs focusable, focusableInTouchMode, clickable et longClickable sont définis sur la même valeur ... 

Cependant, je devais explicitement définir focusable et focusableInTouchMode sur true pour que cela fonctionne avec la saisie tactile.

1
A.J.Bauer

C'était la seule solution simple et complète pour moi.

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

Définir ceci dans le fichier xml EdiTextView

Android:focusable="false"
0
Nandakishore Shetty

Je n'ai eu aucun problème à rendre EditTextPreference en lecture seule, en utilisant:

editTextPref.setSelectable(false);

Cela fonctionne bien lorsque vous utilisez le champ 'summary' pour afficher les champs en lecture seule (utile pour afficher les informations du compte, par exemple). Mise à jour des champs de résumé dynamiquement saisis dans http://gmariotti.blogspot.com/2013/01/preferenceactivity-preferencefragment.html

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
Jason Harmon