esta é a minha implementação (um pouco longa, mas útil para mim!): Com esse código, você pode tornar o EditView somente leitura ou Normal. mesmo no estado somente leitura, o texto pode ser copiado pelo usuário. você pode alterar o backgroud para torná-lo diferente de um 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;
}
}
o benefício desse código é que, o EditText é exibido como o EditText normal, mas o conteúdo não é alterável. O valor de retorno deve ser mantido como uma variável para que se possa reverter do estado somente leitura para o normal.
para fazer um EditText somente leitura, basta colocá-lo como:
TextWatcher tw = setReadOnly(editText, true, null);
e para torná-lo normal, use tw da declaração anterior:
setReadOnly(editText, false, tw);