voici mon implémentation (un peu longue, mais utile pour moi!): Avec ce code vous pouvez rendre EditView Read-only ou Normal. même en lecture seule, le texte peut être copié par l'utilisateur. vous pouvez changer le backgroud 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 le EditText est affiché en tant que EditText normal mais le contenu n'est pas modifiable. La valeur de retour doit être conservée en tant que variable pour pouvoir revenir de l'état en lecture seule à l'état normal.
pour rendre un EditText en lecture seule, il suffit de le mettre comme:
TextWatcher tw = setReadOnly(editText, true, null);
et pour le rendre normal, utilisez tw de la déclaration précédente:
setReadOnly(editText, false, tw);