Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo replicar android: editable = "false" en el código?

En el diseño, puede establecer que el widget EditText no sea editable a través del android:editable attribute .

¿Cómo puedo hacer esto en código? Necesito hacer que el widget EditText sea ​​editable dependiendo de las condiciones.

  • Android EditText onClickListener
  • Cómo poner editable editable dentro de un listview?
  • ¿Podemos tener texto ineditable en edittext
  • Cómo establecer un texto en un Edittext que está en un cuadro de diálogo?
  • Cómo eliminar el subrayado del campo EditText en Android?
  • El cursor EditText se vuelve invisible en JellyBean
  • Andengine: Añade una vista que contiene los controles de interfaz de usuario en la parte superior de andengine usando addContentView
  • Problema de enfoque en la visualización de ListView EditText en el cuadro de diálogo en Android
  • 14 Solutions collect form web for “Cómo replicar android: editable = "false" en el código?”

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

    Edit: dlazar sugirió (a continuación) cambiar el return a dst.subSequence(dstart, dend) para superar el comportamiento que elimina las palabras.

     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.

    Acabo de probar esto yo mismo,

    Para desactivar la edición de texto:

     .setFocusable(false); 

    Esto también establece setFocusableInTouchMode a false!

    Para habilitar la edición de texto:

     setFocusableInTouchMode(true); 

    Esto también establece setFocusable a true;

    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 su xml o

     EditText mEdit = (EditText) findViewById(R.id.yourid); mEdit.setEnabled(false); 

    o

     EditText mEdit = (EditText) findViewById(R.id.yourid); mEdit.setKeyListener(null); 

    Puede probar esto:

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

    Esto desactivará completamente EditText, desactivar la prensa larga si no desea que el usuario abra las opciones de edición de texto.

    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 otro TextView cuyo android:editable="false" y usar setVisiblilty() para cambiar entre las vistas editables y no editables. Si utiliza View.GONE el usuario nunca sabrá que hay dos EditTexts.

    Si su sensación ambiciosa que podría hacer algo con el oyente onTextChanged como tener que reaccionar con un setText .

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

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

    Por ejemplo, digamos que tiene el texto "foo" en el EditText . Si selecciona todo (por ejemplo, haciendo doble clic sobre él) y escribe 'a' , el texto desaparecerá. Esto se debe a que 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 ), lo que explica el texto que falta.

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

    ¿Ha intentado setText (java.lang.CharSequence, android.widget.TextView.BufferType) ? Se describe como:

    Establece el texto que debe mostrar este TextView (vea setText (CharSequence)) y también establece si se almacena en un búfer de estilo / spannable y si es editable .

    (Énfasis mío)

    También quería señalar una solución alternativa que funciona bien si está creando nuevas instancias de un EditView. Puede sobrescribir el método getDefaultEditable () tal como lo sugieren los documentos para devolver false. P.ej

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

    supongo

     Edittext.setEnabled(false); 

    Mediante código

    y

     android:enabled="false" 

    A través de xml.Also comprobar este puesto en SO .

    Deberían funcionar y se puede habilitar de nuevo programaticamente Edittext.setEnabled(true);

    La única solución que he encontrado para este escenario es crear 2 diseños. Uno es editable y uno no lo es. Es posible que tenga que crear más de 2 diseños según diferentes condiciones. Almacene las condiciones en SharedPreferences u otros medios y cargue el diseño correspondiente en función de las condiciones después de reiniciar la actividad. He aquí un ejemplo:

    In 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 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 recargar la actividad / disposiciones. -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; } } }}); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.