Cómo hacer que el texto de edición no sea editable pero se pueda hacer clic en JAVA

91

¿Es posible hacer EditTextclickable pero no editable?

No quiero que sea editable (ni debería aparecer el teclado ni deberíamos poder cambiar la pista)

En realidad, quiero usar Editar texto simplemente como una imagen con una pista (que no se puede cambiar). Sé que la forma real era usar un ImageViewy uno TextView, pero quiero probarlo EditTextporque luego usaré solo una vista en lugar de 2. Además, todo es dinámico, por lo que no XML.

Para el requisito anterior, la solución en XML es, android:editable="false"pero quiero usar esto en Java.

Pero,

Si uso: -

et.setEnabled(false);

o

 et.setKeyListener(null);

Hace que EditTextno sea EDITABLE pero al mismo tiempo hace que no se pueda hacer clic en él.

Aamir Shah
fuente
¿Qué tal la configuración et.setClickable(true)? Podría funcionar.
Hein
ya lo intenté ... pero no funcionó ... cualquier otro pensamiento
Aamir Shah
1
tal vez intente usar un diseño relativo y coloque un rectángulo vacío o algo ENCIMA del texto de edición, y pruebe lo que se puede hacer clic en el rect ..
Wops

Respuestas:

168

El truco aquí es:

et.setFocusable(false);
et.setClickable(true);
Aamir Shah
fuente
5
pero si ha copiado algún valor de cualquier campo, puede pegar ese valor, escuchar presionando lang, tocar y pegar ... cualquier idea de cómo eliminarlo
Rishabh Agrawal
11
@ANinJa puede establecer el clic largo en falso, es decir, et.setLongClickable (falso);
Luis
Hmm, el cursor se resalta de una manera extraña al hacer clic / hacer clic largo ... Pero no tengo un enfoque mejor. : /
Martin Pfeffer
1
¡Perfecto! es posible que deba agregar et.setLongClickable (false) para evitar copiar / pegar también
thanhbinh84
1
Perfecto, ¿es usted doctor?
Iman Marashi
22

puede configurar EditTextusando el código Java como siguiente: -

edittext.setFocusable(false);
edittext.setClickable(true);

o utilizando el siguiente código en el archivo XML para EditText.

android:editable="false" 
android:inputType="none"  
abhi
fuente
22

Como editableestá en desuso. puede usar android:inputTypecomo none para diseñar xml o como InputType.TYPE_NULL en codificación.

Diseñando XML

<android.support.v7.widget.AppCompatEditText
    android:id="@+id/edt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="false"
    android:inputType="none"
    android:text="EditText"/>

Codificación

edt.setClickable(true);
edt.setFocusable(false);
edt.setInputType(InputType.TYPE_NULL);

Y a continuación se muestra el evento de clic de edittext

edt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(YourActivity.this,"edt click", Toast.LENGTH_LONG).show();
    }
});
Nirav Bhavsar
fuente
Funcionó como un encanto para mí
Karim Bibars
8

Puedes usar esto ...

android:focusableInTouchMode="false"

para hacer que edittext no sea editable en xml. Y para el evento en el que se puede hacer clic, puede usar el evento setOnTouchListener () para hacer lo mismo que me gusta.

editText.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
                        //do your stuff here..
        return false;
    }
});
ridoy
fuente
1
Parece que android:focusableInTouchMode="false"también se requiere ( android:focusable="false"solo no funciona) en Android O. Al menos, en DP2.
xip
7

android:editable está en desuso, pero puede hacer stg como a continuación:

android:editable="false"
android:focusable="false"
android:focusableInTouchMode="false"

Usé la cade anterior para editar textos en los que utilizo selectores para establecer datos. Puede usar el diseño de entrada con esto.

salvar población
fuente
7

Edittext habilitar y deshabilitar para la edición como esta

EditText edit = (EditText) findviewby(R.id.edittext);

A través del código java

edit.setEnabled(false); //non editable
edit.setEnabled(true); //editable

A través de xml

<EditText
    android:id="@+id/otp_mpin"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:editable="false"
    android:focusable="false"/>
Kishore Reddy
fuente
0

Para mí, ninguna de las respuestas resultó en una solución completamente funcional.

Muestra de mi solución https://www.youtube.com/watch?v=oUA4Cuxfdqc

Guía (amigable para novatos) , tenga en cuenta los pocos comentarios en el código.

Cree una clase Java para un archivo personalizado EditTextllamado EditTextDispatched.java

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

/**
 * @author Martin Pfeffer
 * @see <a href="https://celox.io">https://celox.io</a>
 */
public class EditTextDispatched extends android.support.v7.widget.AppCompatEditText {

    private static final String TAG = "DispatchingEditText";

    private boolean editable = true;

    public EditTextDispatched(Context context) {
        super(context);
    }

    public EditTextDispatched(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditTextDispatched(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    // get the current state
    public boolean isEditable() {
        return editable;
    }

    // set your desired behaviour
    public void setEditable(boolean editable) {
        this.editable = editable;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent motionEvent) {

        if (editable) {
            // default behaviour of an EditText
            super.dispatchTouchEvent(motionEvent);
            return true;
        }

        // achieve the click-behaviour of a TextView (it's cuztom)
        ((RelativeLayout) getParent()).onTouchEvent(motionEvent);
        return true;
    }

}

EditTextDispatchedHaga referencia a en su xml (tendrá que alterar el pgk-name):

  <io.celox.brutus.EditTextDispatched
    android:id="@+id/row_field_value"
    style="@style/row_field_text_display"
    android:layout_alignParentBottom="true"
    android:text="@string/sample_field_value" />

Invocar:

private void changeEditTextBehaviour(EditTextDispatched value, boolean editable) {
    value.setEditable(editable);
    value.setEnabled(editable);
}
Martin Pfeffer
fuente
0

Tal vez puedas intentar

editText.setEnabled(false);
默默 磊 OK
fuente
0

Sé que esta pregunta ya ha sido respondida, pero para dar una respuesta más actual (es decir, 2018) aquí está la configuración que utilizo para lograr el efecto solicitado (es decir, sin entrada o editable):

    val etUserLoc: EditText = themedEditText(R.style.Pale_Blue_Text_Bold_13) {
                id = R.id.et_comp_user_keys_var_user_location
                inputType = InputType.TYPE_NULL
                isClickable = true
                isFocusable = false
                textColor = resources.getColor(R.color.magenta)  // overrides the default theme color
                text = Editable.Factory.getInstance().newEditable(resources.getString(R.string.loc_swakopmund))
            }.lparams(width = matchConstraint, height = matchParent) {   }

Sí, esto es ANKO ya que ya no uso XML en ninguno de mis proyectos de Android. El 'inputType' se encarga de la desaprobación de 'isEditable'.

SilSur
fuente
0

A partir de 2020, si también le preocupa la accesibilidad, debe evitar la configuración, et.setFocusable(false);ya que eso hará que no se pueda acceder a EditText mediante la navegación del teclado.

Aquí está mi solución:

Kotlin

editText.isFocusableInTouchMode = false

editText.isLongClickable = false //this will prevent copy and paste

editText.setOnClickListener {
   // handle the click
   // this will automatically make the edittext clickable = true
}
Benny
fuente
-1

también puede hacer android:inputMethod="@null"en su EditTexty no mostrará el cursor o el teclado y luego puede captar fácilmente el oyente de configuración de clic.

SaadurRehman
fuente