Pregunta

En el diseño puede configurar el EditText El widget no será editable a través del android:editable attribute.

¿Cómo puedo hacer esto en código?necesito hacer el EditText El widget será editable según las condiciones.

¿Fue útil?

Solución

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) para cambiar el return a dst.subSequence(dstart, dend) para superar el comportamiento que elimina las palabras.

Otros consejos

editText.setFocusable(false);
editText.setClickable(false);

Esto asegura el EditText El control no se puede seleccionar y enfocar, por lo que no se puede editar.

Solo probé esto yo mismo

Para deshabilitar el texto de edición:

.setFocusable(false);

¡Esto también establece setFocusableTouchMode en falso!

Para habilitar el texto de edición:

setFocusableInTouchMode(true);

Esto también establece setfocusable a verdadero;

La mejor manera de hacerlo es con esta única línea de código:

textView.setKeyListener(null);

Los documentos dicen para este método:

Establece el oyente clave que se utilizará con este TextView. Esto puede ser nulo para no permitir la entrada del usuario.

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

Puedes probar esto:

        mEditText.setFocusable(false);
        mEditText.setClickable(false);
        mEditText.setFocusableInTouchMode(false);
        mEditText.setLongClickable(false);
        mEditText.setInputType(InputType.TYPE_NULL);

Esto deshabilitará por completo EditText, deshabilitará Long Press si no desea que el usuario abra Opciones de texto.

No veo un método relacionado para ese atributo en la clase EditText. Sin embargo, hay otras cosas similares que podría usar, comoandroid:focus/setFocusable(boolean) o crear otra vista text cuyaandroid:editable="false" y use setVisiblilty() Cambiar entre las vistas editables y no editables. Si utiliza View.GONE El usuario nunca sabrá que hay dos editTexts.

Si te sientes ambicioso, probablemente podrías hacer algo con los edittext onTextChanged al oyente le gusta que reaccione con un setText.

Publicar una nueva respuesta, ya que no puedo comentar sobre la respuesta de Josef.

El filtro de entrada funciona bien, pero tiene un error sutil: escribir sobre una selección eliminará todo el texto.

Por ejemplo, digamos que tienes el texto "foo" en el EditText. Si lo selecciona todo (por ejemplo, haciendo doble clic en él) y escriba 'a', el texto desaparecerá. Esto es porque el 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), que explica el texto perdido.

La solución es simplemente regresar dst.subSequence(dstart, dend) en la función de filtro. Esto funcionará bien incluso para eliminar.

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 se almacena en un búfer estilable/espectable y si es editable.

(énfasis mío)

Supongo

Edittext.setEnabled(false); 

a través del código

y

android:enabled="false"

A través de XML. También consulte esta publicación en ASI QUE.

Deberían funcionar y puede habilitar nuevamente programáticamente Edittext.setEnabled(true);

También quería señalar una solución alternativa que funcione bien si está creando nuevas instancias de un EditView. Puede anular el método getDefaultedable () según lo sugerido por los documentos para devolver falso. P.ej

EditText view = new EditText(DiscountCalculator.this) {
    public boolean getDefaultEditable() {
        return false;
    }
};

La única solución que encontré para este escenario es crear 2 diseños.Uno es editable y el otro no.Es posible que tengas que 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 según las condiciones después de reiniciar la Actividad.He aquí 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 basándose en la prueba de la condición y llamando a funciones 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 solución mejor, 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

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

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;
            }
        }
    }});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top