style - Cómo replicar Android: editable="false" en el código?
propiedades edittext android (14)
¿Has probado setText (java.lang.CharSequence, android.widget.TextView.BufferType) ? Se describe como:
Establece el texto que este TextView debe mostrar (ver setText (CharSequence)) y también establece si está almacenado en un búfer editable / estiloable y si es editable .
(énfasis mío)
En el diseño, puede configurar el widget EditText
para que no sea editable a través del android:editable attribute
.
¿Cómo puedo hacer esto en el código? Necesito hacer que el widget EditText
sea editable dependiendo de las condiciones.
Creo que la forma correcta de lograr el efecto deseado es:
mEditView.setText("my text", BufferType.NORMAL);
Si desea cambiar entre editable y no editable, puede hacer lo siguiente:
// Switch to non-editable
mEditView.setText(mEditView.getText(), BufferType.NORMAL);
// Switch back to editable
mEditView.setText(mEditView.getText(), BufferType.EDITABLE);
Creo que un InputFilter
que rechaza todos los cambios es una buena solución:
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) : "";
}
}
});
Editar: dlazar sugirió (a continuación) cambiar el return
a dst.subSequence(dstart, dend)
para superar el comportamiento que elimina palabras.
La única solución que he encontrado para este escenario es crear 2 diseños. Uno es editable y el otro no. Es posible que deba crear más de 2 diseños según diversas condiciones. Almacene las condiciones en SharedPreferences u otros medios y cargue el diseño relevante en función de las condiciones después de reiniciar la actividad. Aquí hay un ejemplo:
en onCreate () de la actividad:
configuration = new Configuration(this.getSharedPreferences(Configuration.SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE));
manualSettingsMode = configuration.isManualSettingsMode();
if(manualSettingsMode){
setContentView(R.layout.editableconfigurationsettings);
}else {
setContentView(R.layout.configurationsettings);
}
La actividad se puede reiniciar en función de las pruebas de condición y funciones de llamada como:
private void setManualEditing(){
configuration.set_isManualSettingsMode(true);
this.recreate();
}
private void setAutoEditing(){
configuration.set_isManualSettingsMode(false);
this.recreate();
}
Espero que esto ayude. Realmente tiene que haber una mejor solución, pero esto es lo que he estado haciendo. Idealmente, uno podría hacer esto en campos individuales y no tener que volver a cargar la actividad / diseños. -poli
La mejor manera de hacerlo es con esta única línea de código:
textView.setKeyListener(null);
Los documentos dicen por este método:
Establece el oyente clave que se utilizará con este TextView. Esto puede ser nulo para no permitir la entrada del usuario.
Lo intenté yo solo,
Para deshabilitar la edición de texto:
.setFocusable(false);
¡esto también establece setFocusableInTouchMode en falso!
Para habilitar la edición de texto:
setFocusableInTouchMode(true);
esto también establece setFocusable en true;
No veo un método relacionado para ese atributo en la clase EditText. Sin embargo, hay otras cosas similares que podrías usar como android:focus/setFocusable(boolean)
o crear otra TextView cuyo android:editable="false"
y usar setVisiblilty()
para alternar entre las vistas editables y las no editables. Si usa View.GONE
el usuario nunca sabrá que hay dos EditTexts.
Si te sientes ambicioso, probablemente puedas hacer algo con el oyente onTextChanged
como hacer que reaccione con un setText
.
Puedes intentar esto:
mEditText.setFocusable(false);
mEditText.setClickable(false);
mEditText.setFocusableInTouchMode(false);
mEditText.setLongClickable(false);
mEditText.setInputType(InputType.TYPE_NULL);
Esto deshabilitará completamente EditText, deshabilita la pulsación larga si no desea que el usuario abra las opciones de edición de texto.
También quería señalar una solución alternativa que funciona bien si está creando nuevas instancias de un EditView. Puede anular el método getDefaultEditable () según lo sugerido por los documentos para devolver falso. P.ej
EditText view = new EditText(DiscountCalculator.this) {
public boolean getDefaultEditable() {
return false;
}
};
[Publicando una nueva respuesta, ya que no puedo comentar la respuesta de Josef.]
El filtro de entrada funciona bien, pero tiene un error sutil: al escribir sobre una selección se eliminará todo el texto.
Por ejemplo, supongamos que tiene el texto "foo"
en EditText
. Si lo selecciona todo (por ejemplo, haciendo doble clic en él) y escribe ''a''
, el texto desaparecerá. Esto se debe a que InputFilter
se llamará como:
filter("a", 0, 1, "foo", 0, 3);
El filtro de entrada propuesto devolverá la cadena vacía en este caso (porque src.length() < 1
es false
), lo que explica el texto faltante.
La solución es simplemente devolver dst.subSequence(dstart, dend)
en la función de filtro. Esto funcionará bien incluso para eliminaciones.
prueba esto:
mEditText.setFilters(new InputFilter[]{new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (XXX) {
return "";
} else {
return null;
}
}
}});
supongo
Edittext.setEnabled(false);
a través del código
y
android:enabled="false"
a través de xml. También verifique esta publicación en SO .
Deberían funcionar y puede habilitar de nuevo programáticamente Edittext.setEnabled(true);
android:editable="false"
android:inputType="none"
en tu xml o
EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setEnabled(false);
o
EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setKeyListener(null);
editText.setFocusable(false);
editText.setClickable(false);
esto asegura que el control EditText
no se puede seleccionar y enfocar, por lo que no se puede editar.